Unicode 純量值是 Unicode 標準為每個已指派字元所指派的單一抽象整數,而Unicode 編碼器 / 解碼器 透過完全在瀏覽器中執行,在你的字串中呈現每一個純量——無需字元碼查詢 API 呼叫、無需伺服器往返,也無需上傳。這個工具以 Unicode 碼點而非 JavaScript UTF-16 碼元來逐一檢視你的輸入,這正是它能將 😀 呈現為單一符記 U+1F600 而非將其拆成兩個代理對半體的關鍵差異。它接著以至少四位十六進位數字來格式化基本字元——A 會變成 U+0041——而輔助平面字元則保留其完整的數值。轉換在瀏覽器本機進行,因此只要頁面載入完成即可運作,並避免任何將貼上的文字傳送至遠端端點所衍生的隱私疑慮。這使得它成為託管式字元碼查詢 API 的實用替代方案,適合需要檢查字串、診斷複製貼上比較為何失敗,或從日誌或文件中擷取到的純量符記重建文字的開發人員。

char code lookup api alternative
char code lookup api alternative

為何在本機執行字元碼查詢,而非呼叫 API

託管式的字元碼查詢 API 會接收你的字串、透過網路送出,然後回傳一個或多個代碼識別子。這雖然可行,卻會帶來摩擦:你需要一組 API 金鑰、必須仰賴該服務持續上線、每次按鍵都得支付往返延遲的成本,還得信任該端點會妥善處理你正在檢查的任何文字——當那段文字是客戶資料、秘密權杖,或從私人文件複製的片段時,這可能成為實質的疑慮。

基於瀏覽器的轉換器則迴避了上述所有問題。Unicode 編碼器 / 解碼器中的轉換在本機執行:貼上字串、點選轉換,結果便在不離開頁面的情況下出現。沒有帳號、沒有配額、沒有 API 金鑰,也不會有洩漏你正嘗試偵錯之字元的風險。當你反轉操作,餵入 U+XXXX 或 \u{...} 符記以重建原始文字時也是如此。

這正是「API 替代方案」這個框架所要填補的落差:你仍想要字元碼查詢 API 所提供的那種具確定性、以標準為後盾的答案,卻不想承受網路依賴、註冊流程,或是上傳即將檢查之字串的麻煩。

將文字編碼為 Unicode 碼點

  1. 選擇「文字轉碼點」方向,貼上你想檢查的確切字串,包括你看不到的字元——換行、定位字元、零寬連接符以及 BOM 標記都算在內。
  2. 執行轉換並讀取結果:一連串 U+ 十六進位標籤,每個 Unicode 純量值對應一項,以大寫呈現,基本字元至少四位數。
  3. 複製 U+ 序列,並與某個程式庫、日誌行或正規表達式所預期的內容進行比對;若可見輸出看起來完全相同,但 U+ 序列卻有差異,這種不符通常源於標準化方式的差異、不可見的控制字元,或是遺漏的連接符。

幾個範例可以說明你可預期的輸出:

  • 單一 ASCII 字母 A 會變成 U+0041
  • 附音字元 é 的預組形式會變成 U+00E9
  • 輔助平面的表情符號 😀 會變成 U+1F600,而非 JavaScript UTF-16 迭代所產生的代理對 D83D DE00。
  • 換行字元會編碼為 U+000A;零寬連接符則明確顯示為 U+200D

將 U+XXXX 或 \u{...} 符記解碼回文字

當資料流方向相反時,將一串帶有前綴的符記貼入解碼方向。可接受的格式包括 U+XXXX(四位以上十六進位數字)、\uXXXX(JavaScript 風格跳脫),以及 \u{XXXX}\u{XXXXX}(用於輔助平面值的 JavaScript 大括號標記法)。符記之間可以空格、逗號或換行分隔。十六進位數字不區分大小寫,但你必須保留前綴與符記邊界的完整性——若兩個相鄰的符記之間沒有分隔符,可能會被讀成一個更長的十六進位數字。

此工具會在重建任何輸出之前驗證每一個符記。它會拒絕 U+0000 至 U+10FFFF 範圍之外的值,會拒絕 U+D800 至 U+DFFF 的代理範圍,會拒絕缺少前綴的情形,也會拒絕任何非十六進位的字元。只有在所有符記都通過純量值驗證後,才會建構輸出文字,如此你會看到明確的錯誤訊息,而不是悄悄毀損的字元。這種嚴謹性得以避免常見的自相矛盾陷阱——錯誤的代理對慣例會與自身往返轉換,卻永遠不會浮現警告。

碼點、UTF-16 碼元與 UTF-8 位元組是三件不同的事

碼點既不是位元組,也不是 JavaScript 字元。混淆這三個層次,是「字元碼查詢」對非 ASCII 文字給出錯誤答案最常見的原因。

表示方式其所識別的內容é 的範例😀 的範例
Unicode 碼點 (U+)Unicode 標準定義的抽象字元U+00E9U+1F600
UTF-16 碼元JavaScript 字串、.NET、Windows API 使用的 16 位元值00E9(一個碼元)D83D DE00(兩個代理半體)
UTF-8 位元組檔案、URL、JSON、HTTP、多數網路協定所使用的 8 位元值C3 A9F0 9F 98 80

若某個工具將 😀 的值回報為 128512,那是 U+1F600 的十進位形式,表示你正工作在碼點層次,亦即 Unicode 編碼器 / 解碼器所處的同一層次。若它回報 55357 56832,那是兩個 UTF-16 碼元。若它回報 F0 9F 98 80,那是四個 UTF-8 位元組。這三種描述在其各自的層次上都正確;一旦跨層次混用,數字看起來就會互不相容。公開的Unicode 碼點圖表列出抽象字元,而ECMAScript String.fromCodePoint則定義了 JavaScript 執行環境所使用的碼點建構式。當某個協定、檔案格式或儲存層次要求的是位元組而非純量時,請改用 UTF-8 位元組轉換器。

真實世界的字串,極少在可見字元與碼點之間呈現一對一對應

碼點未必等同於使用者所感知的字元。表情符號 👩‍💻(女性工程師)是一段由三個碼點組成的序列——U+1F469(女性)、U+200D(零連接符)以及 U+1F4BB(筆記型電腦)——並呈現為單一字素。許多國旗、家庭表情符號、附音字母以及文字系統形式皆採用同樣的多純量序列。下表展示一些常見輸入實際上是如何拆解的。

可見字元或字串純量序列
AU+0041
é(預組形式)U+00E9
é(分解形式)U+0065 U+0301
😀U+1F600
👩‍💻U+1F469 U+200D U+1F4BB
換行U+000A
♪(音符符號)U+266A

兩列 é 在呈現時看起來一模一樣,且兩者皆為有效的 Unicode,但它們的純量序列不同。當搜尋查詢、識別子、檔案名稱或比較在毫無明顯原因下失敗時,正需要把這種差異浮上檯面。Unicode 編碼器 / 解碼器在不解構進行正規化的前提下將其呈現,因此你貼上什麼,就解碼出什麼。控制字元與預設可忽略的碼點也包含在內,這就是為什麼零寬連接符會明確顯示為 U+200D,而換行則顯示為 U+000A——揭露那些能解釋游標意外移動、或解釋從其他來源貼上的文字為何無法通過完全比對的形數值。

此工具的適用範圍,以及何時該交棒給其他工具

U+ 表示法是一種診斷格式,並非適用於每種程式語言的跳脫方式。HTML 實體使用 &...; 或 &#...;,JSON 在字串字面值中使用 \uXXXX,URL 編碼以 %XX 表示每個位元組,而 UTF-8 則使用原始位元組。每一種都有其自身的語法與規則,這些都不在檢查 Unicode 純量值的範圍之內。當你真正想問的是某個字串含有哪些抽象字元時,請使用 Unicode 編碼器 / 解碼器。當某個協定或檔案格式要求位元組層級的編碼時,請使用 UTF-8 位元組轉換器;當你需要特定的跳脫語法時,則使用 HTML 實體編碼器、URL 解碼器,或你所屬執行環境的 JSON 風格跳脫機制。將純量檢查視為字元身分的根本依據,即可在這些編碼方式之間切換,而不致迷失原始字串的實際內容。

此工具亦有一項明確且較小的限制:輸入上限為 100,000 個碼點,以維持渲染與複製操作的流暢。它不會查詢字元名稱、字集、易混淆狀態或語言意義,也不會驗證某個序列是否構成建議的表情符號 ZWJ 序列或單一正字法叢集。這些都是可逆純量轉換之外的獨立 Unicode 屬性,將其視為超出範疇,正是這個工具能保持專注並值得信賴、作為本機字元碼查詢替代方案的關鍵。

若你正在權衡各種方案,如何在本地為 1Password 產生密碼對此有詳細說明。

若你正在權衡各種方案,建置於 AES-256-GCM 的 AES 線上加密替代方案對此有詳細說明。