書記素クラスター 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文字」カウンターの表示、またはプレビュー用の文字列切り詰めにおいて、コードポイント数の代わりに書記素クラスター数を使用することで、カウントがユーザーが視覚的に認識するものと一致するようになります。

試してみる — String Length Calculator

フルツールを開く