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`で正確な文字数が取れます。
バイト数が重要な場面
データベースの文字列カラム(VARCHAR(255) = 255バイトか255文字かはDB設定による)・HTTPヘッダーのContent-Length・ファイルシステムのファイル名上限(多くのOSで255バイト)などではバイト数が重要です。UTF-8では1文字が1〜4バイトになるため、「255文字まで」なのか「255バイトまで」なのかを意識する必要があります。
CJK文字の扱い
CJK(Chinese, Japanese, Korean)の漢字・仮名・ハングルはUTF-8で3バイトです。Twitterの文字数カウントなどは独自のカウント方法(CJKを2文字分とカウント)を使うサービスもあります。バックエンドのバリデーションとフロントエンドの表示で文字数の定義が違うとバグの原因になります。