ダイアクリティカルマーク
文字の上下に付加される補助記号。アクセント記号やウムラウトなど、発音の違いを示す。
ダイアクリティカルマーク (発音区別符号) とは、文字の上下や横に付加される補助記号の総称です。フランス語のアクセント記号 (é, è, ê)、ドイツ語のウムラウト (ä, ö, ü)、スペイン語のティルデ (ñ)、チェコ語のハーチェク (č, š, ž) などが代表例で、ラテン文字圏を中心に世界中の言語で使われています。これらの記号は単なる装飾ではなく、発音や意味の区別に不可欠な要素です。たとえばフランス語では ou (または) と où (どこ) のようにアクセント記号の有無で意味が変わります。
Unicode では、ダイアクリティカルマーク付きの文字を 2 通りの方法で表現できます。1 つは「合成済み文字」(NFC: Normalization Form Composed) で、é を単一のコードポイント U+00E9 として扱います。もう 1 つは「基底文字 + 結合文字」(NFD: Normalization Form Decomposed) で、e (U+0065) とアキュートアクセント (U+0301) を組み合わせて表現します。この二重表現は Unicode の設計上の特徴であり、既存の文字コードとの互換性を保ちつつ、あらゆる言語の文字を柔軟に表現するために導入されました。文字コード技術の書籍で詳しく学べます。
実務では、この二重表現が文字列比較やソートで深刻な問題を引き起こします。見た目がまったく同じ「é」でも、NFC と NFD ではバイト列が異なるため、単純なバイト比較では一致しません。データベースの検索、ファイル名の照合、パスワードの検証など、文字列の同一性判定が求められる場面では Unicode 正規化を適用して表現を統一する必要があります。macOS のファイルシステム (APFS) は NFD を使用する傾向があり、Windows (NTFS) は NFC を使用するため、クロスプラットフォーム開発ではファイル名の正規化が特に重要です。
よくある誤解として、ダイアクリティカルマークを単に「アクセント記号」と呼ぶケースがあります。アクセント記号はダイアクリティカルマークの一種にすぎず、セディーユ (ç)、オゴネク (ą)、マクロン (ā) なども含む広い概念です。また、日本語の濁点 (゛) や半濁点 (゜) も Unicode 上は結合文字として扱われるため、広義にはダイアクリティカルマークの仲間といえます。
プログラミングにおいては、JavaScript の String.prototype.normalize() メソッドや Python の unicodedata.normalize() 関数を使って正規化を行います。Web アプリケーションでフォーム入力を受け取る際には、サーバー側で NFC 正規化を適用してからデータベースに保存するのが一般的な手法です。多言語プログラミングの書籍も参考になります。
文字数カウントの観点では、NFD 形式のテキストは基底文字と結合文字が別々のコードポイントとしてカウントされるため、見た目の文字数よりも多くなります。たとえば「café」は NFC では 4 文字ですが、NFD では 5 文字 (c, a, f, e, ́) としてカウントされます。正確な「見た目の文字数」を得るには、書記素クラスタ単位でカウントする必要があり、文字数カウントツールの実装においてダイアクリティカルマークの扱いは避けて通れない課題です。