作ったもの
Unicode Lookup — https://sen.ltd/portfolio/unicode-lookup/
- 4 検索モード: 文字 / コードポイント / 名前 / ブロック
- UTF-8 バイト列(1-4 バイト)
- UTF-16 コード単位(サロゲートペア表示)
- HTML エンティティ / CSS エスケープ / JS エスケープ
- Unicode 正規化 4 形式(NFC / NFD / NFKC / NFKD)
- 59 Unicode ブロックをブラウズ可能
vanilla JS、ゼロ依存、ビルド不要。node --test で 75 ケース。
UTF-8 は可変長
ASCII = 1 バイト、欧文アクセント = 2 バイト、CJK = 3 バイト、絵文字など追加面 = 4 バイト。リードバイトの上位ビットで長さが分かる(0xxxxxxx / 110xxxxx / 1110xxxx / 11110xxx)。継続バイトは必ず 10xxxxxx。この自己同期性がストリーム復旧のしやすさの源。
JS 文字列は UTF-16 サロゲートペア
"😀".length === 2 になる理由。BMP 外(> 0xFFFF)の文字は 20 ビットを 10/10 に分けて、ハイサロゲート(0xD800-0xDBFF)とロウサロゲート(0xDC00-0xDFFF)のペアで符号化。
正規化 4 形式
「é」には 2 通りの表現がある:
- 1 コードポイント(U+00E9、NFC 形式)
- 2 コードポイント(e + 結合アクセント、NFD 形式)
見た目は同じだが === では等しくない。比較・DB キー・ファイル名のバグの温床。str.normalize('NFC') で解決。
CSS エスケープの罠
HTML: 😀
CSS: \1F600 (← プレフィックスなし、末尾にスペース必要なことも)
JS ES2015+: \u{1F600}
JS legacy: \uD83D\uDE00 (サロゲートペア)
CSS だけ他と形式が違うのが地味に引っかかる。
シリーズ
100+ 公開ポートフォリオ シリーズの #46 です。
