コードポイント
Unicode で各文字に割り当てられた一意の番号。U+0041 (A) のように U+ に続く 16 進数で表記する。
コードポイントとは、Unicode 規格で各文字に割り当てられた一意の番号です。U+0041 (ラテン大文字 A)、U+3042 (ひらがな あ)、U+1F600 (笑顔の絵文字) のように、U+ に続く 16 進数で表記されます。Unicode の文字を識別するための最も基本的な単位であり、文字処理のあらゆる場面で参照されます。
コードポイント空間は U+0000 から U+10FFFF までで、約 110 万個の番号を持ちます。ただし、そのすべてに文字が割り当てられているわけではなく、2025 年 9 月に公開された Unicode 17.0 で符号化されている文字は 159,801 字です。空間は 17 の「面 (Plane)」に分割されており、最初の面 (BMP: Basic Multilingual Plane、U+0000 から U+FFFF) に日常的に使われるほとんどの文字が収録されています。BMP 外の文字 (絵文字や古代文字など) は補助面に配置されます。なお U+D800 から U+DFFF はサロゲート用に予約された番号で、ここに文字が割り当てられることはありません。この範囲を単独の文字として扱おうとすると、多くの処理系はエラーを返すか、置換文字 U+FFFD に置き換えます。
JavaScript では String.codePointAt() でコードポイントを取得でき、String.fromCodePoint() でコードポイントから文字を生成できます。Python では ord() と chr() が同様の機能を提供します。正規表現では \u{1F600} のように波括弧付きの記法で BMP 外のコードポイントを指定できますが、JavaScript の場合はこの書き方に u フラグ (または v フラグ) が必要です。フラグを付け忘れてもエラーにはならず、u{1F600} という文字列そのものに一致する別のパターンとして扱われるため、絵文字を弾く目的のバリデーションが黙って無効になります。
1 つのコードポイントが必ずしも 1 つの「見える文字」に対応するわけではありません。結合文字 (アクセント記号など) は基底文字と組み合わせて 1 つの書記素クラスタを構成します。絵文字も同じで、家族の絵文字は 4 つの人物と 3 つの ZWJ (U+200D) を合わせた 7 コードポイントが 1 文字に見えている状態です。組み合わせの上限は決まっておらず、肌の色と記号を重ねたキスの絵文字のように 10 コードポイントに達するものもあります。逆に、ゼロ幅スペース U+200B や文字の並び方向を指示する U+200E のように画面に見えない書式用の文字も、コードポイントとしては 1 つ分カウントされます。貼り付けられたテキストの文字数が見た目と合わないときは、まずこの種の不可視文字が混入していないかを疑います。
コードポイントとエンコーディングの関係も重要です。同じコードポイント 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 を使う必要があります。たとえば「か」に濁点を後置して「が」と表した文字列は、コードポイント数では 2、書記素クラスタでは 1 です。数え方は用途で決まります。入力欄の残り文字数のように人の目に見える単位を示す場面は書記素クラスタ、データベースの桁数や API の上限を守る場面は符号化後のバイト数、外部サービスの制限に合わせる場面はその相手の数え方に従います。1 つの画面に複数の数え方が同居することもあるため、どの数値をどの単位で出しているかを設計時に書き分けておきます。