書記素クラスター vs コードポイント:詳細な比較
書記素クラスター(ユーザーが見るもの)とコードポイント(Unicodeが定義するもの)の重要な違いを学び、各測定をいつ使うべきかを理解します。
Emoji
詳細な説明
書記素クラスター vs コードポイント
書記素クラスターとコードポイントの違いを理解することは、どのプログラミング言語でも正しい文字列処理の基本です。
定義
- コードポイント:Unicode標準の単一エントリ(例:U+0041 = "A")。Unicodeの原子的な単位。
- 書記素クラスター:人間が単一の「文字」として認識するもの。1つ以上のコードポイントで構成される場合があります。
異なる場合
| テキスト | 書記素 | コードポイント | 比率 |
|---|---|---|---|
| ABC | 3 | 3 | 1:1 |
| é(合成済み) | 1 | 1 | 1:1 |
| é(分解済み) | 1 | 2 | 1:2 |
| 🇯🇵(国旗) | 1 | 2 | 1:2 |
| 👋🏾(スキントーン) | 1 | 2 | 1:2 |
| 👨👩👧👦(家族) | 1 | 7 | 1:7 |
Intl.Segmenter API
モダンブラウザは正しい書記素セグメンテーションのためにIntl.Segmenterを提供します:
const segmenter = new Intl.Segmenter("en", { granularity: "grapheme" });
const graphemes = [...segmenter.segment("👨👩👧")];
graphemes.length; // 1
スプレッド演算子との比較
[..."👨👩👧"].length; // 5 (コードポイントであり、書記素ではない)
スプレッド演算子はコードポイント境界で分割し、書記素境界ではありません。
どちらを使うべきか?
| ユースケース | 推奨メトリック |
|---|---|
| ユーザー向け文字カウンター | 書記素クラスター |
| データベースVARCHAR(n) | DBに依存(通常はコードポイント) |
| UTF-8ストレージ計算 | UTF-8バイト数 |
| APIペイロードサイズ | UTF-8バイト数 |
| 表示用文字列切り詰め | 書記素クラスター |
経験則
測定がユーザー向けの場合(文字カウンター、切り詰め)は書記素クラスターを使用。システム向けの場合(ストレージ、ネットワーク)はバイト数を使用。Unicodeアルゴリズム(正規化、照合)を使用する場合はコードポイントを使用。
ユースケース
文字制限付きのテキスト入力フィールドの実装、「残りN文字」カウンターの表示、またはプレビュー用の文字列切り詰めにおいて、コードポイント数の代わりに書記素クラスター数を使用することで、カウントがユーザーが視覚的に認識するものと一致するようになります。