結合文字とダイアクリティカルマーク

結合ダイアクリティカルマークが複数のコードポイントから視覚的な文字を作成する方法と、書記素クラスター数がコードポイント数と異なる理由を理解します。

Multi-byte Characters

詳細な説明

結合文字:複数のコードポイント、1つの視覚的文字

Unicodeでは、基本文字に1つ以上の結合マークを追加して文字を構成できます。結果は単一の文字に見えますが、複数のコードポイントで構成されています。

例:éの2つの方法

合成済み(NFC):

é  →  U+00E9 (1コードポイント、2 UTF-8バイト)

分解済み(NFD):

é  →  U+0065 + U+0301 (2コードポイント、3 UTF-8バイト)

両方ともéと同じように表示されますが:

メトリック 合成済み 分解済み
.length 1 2
コードポイント数 1 2
書記素クラスター数 1 1
UTF-8バイト数 2 3

重なった結合マーク

単一の基本文字に複数の結合マークを重ねることができます:

à́̂  →  a + グレーブ + アキュート + サーカムフレックス

これは4つのコードポイントから1つの書記素クラスターを作成します。JavaScriptの.lengthは4を返しますが、視覚的には1文字です。

実用的な影響

  1. 文字列の切り詰め:固定コードポイント数で文字列を切ると、結合シーケンスを分割し、文字化けを生じる可能性があります。常に書記素境界で切り詰めてください。
  2. 入力バリデーション:「5文字」の制限はコードポイントではなく書記素クラスターをカウントすべきです。
  3. 文字列比較:"café"(NFC)と"café"(NFD)は同じに見えますが、異なるバイト列です。比較前に正規化してください。

ユースケース

国際的なテキストを扱うテキストエディタ、入力バリデータ、検索機能を構築する際、結合文字を理解することで、壊れた切り詰め、不整合な検索結果、ユーザー向け制限の不正確な文字カウントなどのバグを防止できます。

試してみる — String Length Calculator

フルツールを開く