Unicode・UTF-8エンコーディングの基礎知識
プログラミングで文字列を扱う際、Unicodeコードポイントとエンコーディング(UTF-8/UTF-16)の違いを理解することは重要です。String Inspectorは文字列を分解して各文字のコードポイントとバイト数を可視化します。
UnicodeコードポイントとUTF-8の違い
Unicodeはすべての文字に一意の番号(コードポイント)を割り当てる規格です。例えばAはU+0041、「日」はU+65E5です。UTF-8はこのコードポイントをバイト列として表現するエンコーディング方式で、ASCII文字(U+0000〜U+007F)は1バイト、日本語などは3バイト、絵文字は4バイトで表現します。
絵文字とサロゲートペアの注意点
現代の絵文字(U+1F000以上)はUTF-16では2つのコード単位(サロゲートペア)で表現されるため、JavaScriptの`length`プロパティが実際の文字数と異なることがあります。例えば🌏は`"🌏".length === 2`です。ES2015以降は`[...str].length`や`for...of`でコードポイント単位に数えられます。ただし家族の絵文字「👨👩👧」は人物3つを ZWJ でつないだ5コードポイント(length は8)なので、見た目の1文字として数えるには`Intl.Segmenter`(granularity: "grapheme")を使います。String Inspector はこの4通りの数え方を並べて表示します。
バイト数が重要な場面
データベースの文字列カラム(VARCHAR(255) が255文字か255バイトかはDBによる。MySQL・PostgreSQL は文字数、SQL Server の varchar はバイト数、Oracle は設定による)・HTTPヘッダーのContent-Length・ファイルシステムのファイル名上限(多くのOSで255バイト)などではバイト数が重要です。UTF-8では1文字が1〜4バイトになるため、「255文字まで」なのか「255バイトまで」なのかを意識する必要があります。
CJK文字の扱い
CJK(Chinese, Japanese, Korean)の漢字・仮名・ハングルはUTF-8で3バイトです。Twitterの文字数カウントなどは独自のカウント方法(CJKを2文字分とカウント)を使うサービスもあります。バックエンドのバリデーションとフロントエンドの表示で文字数の定義が違うとバグの原因になります。