結合文字とダイアクリティカルマーク
結合ダイアクリティカルマークが複数のコードポイントから視覚的な文字を作成する方法と、書記素クラスター数がコードポイント数と異なる理由を理解します。
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文字です。
実用的な影響
- 文字列の切り詰め:固定コードポイント数で文字列を切ると、結合シーケンスを分割し、文字化けを生じる可能性があります。常に書記素境界で切り詰めてください。
- 入力バリデーション:「5文字」の制限はコードポイントではなく書記素クラスターをカウントすべきです。
- 文字列比較:"café"(NFC)と"café"(NFD)は同じに見えますが、異なるバイト列です。比較前に正規化してください。
ユースケース
国際的なテキストを扱うテキストエディタ、入力バリデータ、検索機能を構築する際、結合文字を理解することで、壊れた切り詰め、不整合な検索結果、ユーザー向け制限の不正確な文字カウントなどのバグを防止できます。