コードポイント
Unicode で各文字に割り当てられた一意の番号。U+0041 (A) のように U+ に続く 16 進数で表記する。
コードポイントとは、Unicode 規格で各文字に割り当てられた一意の番号です。U+0041 (ラテン大文字 A)、U+3042 (ひらがな あ)、U+1F600 (笑顔の絵文字) のように、U+ に続く 16 進数で表記されます。Unicode の文字を識別するための最も基本的な単位であり、文字処理のあらゆる場面で参照されます。
Unicode は 0 から 10FFFF まで約 110 万のコードポイントを定義可能で、2024 年時点で約 15 万文字が割り当てられています。この空間は 17 の「面 (Plane)」に分割されており、最初の面 (BMP: Basic Multilingual Plane、U+0000 から U+FFFF) に日常的に使われるほとんどの文字が収録されています。BMP 外の文字 (絵文字や古代文字など) は補助面に配置されます。Unicode 規格の解説書でコードポイントの体系を学べます。
JavaScript では String.codePointAt() でコードポイントを取得でき、String.fromCodePoint() でコードポイントから文字を生成できます。Python では ord() と chr() が同様の機能を提供します。正規表現では \u{1F600} のように波括弧付きの記法で BMP 外のコードポイントを指定できます。
1 つのコードポイントが必ずしも 1 つの「見える文字」に対応するわけではありません。結合文字 (アクセント記号など) は基底文字と組み合わせて 1 つの書記素クラスタを構成し、絵文字シーケンス (家族の絵文字など) は最大 7 つのコードポイントで 1 つの表示文字を形成します。逆に、制御文字 (U+200B ゼロ幅スペースなど) は画面に表示されないにもかかわらず、コードポイントとしてカウントされます。
コードポイントとエンコーディングの関係も重要です。同じコードポイント U+3042 (あ) でも、UTF-8 では 3 バイト (E3 81 82)、UTF-16 では 2 バイト (30 42)、UTF-32 では 4 バイト (00 00 30 42) と、エンコーディングによってバイト表現が異なります。BMP 外のコードポイントは UTF-16 ではサロゲートペアとして 4 バイトで表現されます。
文字数カウントの観点では、コードポイント数と「見た目の文字数」は一致しないことが多い点に注意が必要です。JavaScript の [...str].length はコードポイント数を返しますが、書記素クラスタ単位のカウントには Intl.Segmenter を使う必要があります。正確な文字数カウントには、コードポイントの概念を理解した上で適切なレベルのカウント方法を選択することが重要です。プログラミングと Unicode の書籍で正確な文字処理を学べます。