1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UTF-8 バイト・サロゲートペア・正規化 4 形式を表示する Unicode ルックアップを作った

1
Posted at

作ったもの

Unicode Lookuphttps://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 です。

1
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?