Unicode 顯微鏡 · 四個不同的計數層級
人眼所見的一個字元,程式可能會數成四種答案。
使用者感知的 grapheme cluster、Unicode code point、JavaScript 的 UTF-16 code unit 與 UTF-8 實際 bytes 是不同層級。先保留每層證據,再決定是否正規化、跳脫、轉換大小寫或整理行順序。
Grapheme cluster
使用者感知的字形單位
Code point
Unicode 碼位序列
UTF-16 code unit
JavaScript String.length 的計數
UTF-8 bytes
編碼後的位元組長度
Grapheme cluster 結構顯微鏡
U+1F468MANUTF-16 surrogate pairU+1F3FDSKIN TONE膚色修飾碼位U+200DZWJ連接 Emoji 序列U+1F4BBLAPTOPUTF-16 surrogate pairCode point 與編碼明細
Unicode 正規化棱鏡
看起來相同,底層碼位與 bytes 仍可能不同。
é
U+00E9
2 bytes
e + ◌́
U+0065 U+0301
3 bytes
相容分解後再組合
可能折疊全形、連字等區別
相容分解
會拆開並折疊相容差異
不可見字元雷達
U+FEFF檔案開頭或文字邊界訊號
U+200D / U+200C字形連接與 Emoji 序列
U+202A…U+2069視覺顯示順序
U+00A0 / U+202F禁止換行的排版空白
U+FE0F選擇文字或 Emoji 呈現
語法不同,就不能把「Unicode 轉換」當成同一件事
\u{1F680}Backslash unescape 接受 scalar 大括號寫法
\uD83D\uDE80非 BMP 字元輸出 UTF-16 surrogate pair
< &HTML escape 只轉換 & < > 與選定的引號
🚀解碼需要分號,且會拒絕無效 Unicode scalar
大小寫、行、空白與排序邊界
Locale 轉換與人類排序,都不是穩定的資料庫鍵。
Case 依 en-US、目前瀏覽器或 tr-TR locale 處理;Title / camel / snake 等是工具的簡化分詞規則,不是語言學標題大寫。Lines 以 Intl.Collator 排序,去重時保留第一行,trim 與大小寫選項只改變比較鍵;保留 EOL 時,只要原文有 CRLF 就統一輸出 CRLF。Whitespace 視圖會標示 ASCII space、tab、換行、NBSP 與 ZWSP,其他不可見信號要到 Analyze 明細檢查。結果仍受瀏覽器 Unicode 與 collation 資料版本影響。