表意文字
文字自体が意味を持つ文字体系。漢字が代表例で、CJK 統合漢字として Unicode に収録されている。
表意文字とは、文字自体が意味や概念を表す文字体系です。漢字が最も代表的な表意文字であり、中国語、日本語、韓国語、ベトナム語 (歴史的) で共通して使用されてきました。Unicode では CJK 統合漢字 (CJK Unified Ideographs) として、拡張領域 A〜J までを合わせると 10 万字を超える漢字が収録されています (Unicode 17.0 時点)。サロゲートや私用領域を除いた割り当て済み文字のうち 6 割超がこの漢字群であり、単一の文字種としては最大の集団です。
表意文字は表音文字 (アルファベット、ひらがな、ハングルなど) と対比される概念です。表音文字が音を記号化するのに対し、表意文字は概念や意味を直接的に視覚化します。ただし、厳密には漢字は純粋な表意文字ではなく、音を表す部分 (声符) を含む形声文字が多くを占めるため、「表語文字 (logograph)」と呼ぶ方が正確だとする言語学者もいます。
Unicode の CJK 統合漢字は、中国・日本・韓国・ベトナムで使われる漢字を統合 (ユニフィケーション) して収録しています。同じコードポイントでも言語やフォントによって字形が異なる場合があります。たとえば「直」という字は、日本語フォントと中国語フォントで微妙に異なる字形で表示されます。この統合方針は Unicode の設計上の大きな議論点でした。別ブロックの CJK 互換漢字 (CJK Compatibility Ideographs) を字形差の解決手段だと誤解しやすいのですが、これは既存の文字コードとの往復変換を保つために用意されたもので、字形を選ぶための仕組みではありません。互換漢字の大半は Unicode 正規化 (NFC) をかけると統合漢字側のコードポイントへ置き換わるため、正規化を通すデータベースやファイルシステムを経由した時点で区別が失われます。字形を明示したい場合は、漢字の直後に異体字セレクタ (U+E0100〜U+E01EF) を付ける方式を使います。ただしこの方式では 1 文字が 2 コードポイントになるため、JavaScript の length では 3、コードポイント単位では 2、書記素単位では 1 と数え方によって値が変わります。
表意文字の大きな特徴は、言語の壁を越えた意味の伝達が可能な点です。日本人と中国人が互いの言語を話せなくても、漢字の筆談でおおまかな意思疎通ができるのはこの性質によるものです。一方で、漢字の読み方は言語ごとに大きく異なります。「山」は日本語で「やま/さん」、中国語で「shān」、韓国語で「산 (san)」と発音されます。
コンピュータ処理の観点では、表意文字は表音文字と比べていくつかの課題があります。文字数が膨大なためフォントファイルのサイズが大きくなり、Web フォントの読み込み時間に影響します。また、漢字の入力には IME (入力メソッド) が必要であり、キーボードから直接入力できる表音文字とは異なるユーザー体験になります。Web フォントでは unicode-range でサブセットに分割し、実際に使われる字を含むファイルだけを読み込ませる方法が一般的です。バイト数の観点では、UTF-8 で BMP 内の漢字 1 文字は 3 バイト、BMP 外 (拡張 B 以降) の漢字は 4 バイトを消費します。同じ拡張領域でも拡張 A は BMP 内にあるため 3 バイトです。文字数ではなくバイト数で上限を決めている古い API やデータベースのカラムでは、日本語を入れた途端に想定の 3 分の 1 しか入らない、という食い違いが起きます。
文字数カウントの観点では、表意文字は 1 文字で多くの情報を伝えられるため、同じ内容を表音文字で書くよりも文字数が少なくなる傾向があります。英語で「internationalization」(20 文字) と書く内容は、日本語では「国際化」(3 文字) で表現できます。ただし、この情報密度が SNS の入力枠でそのまま有利になるとは限りません。X の上限 280 は加重方式で数えられ、漢字やかなは 1 文字が 2 として扱われるため、日本語では実質 140 字が上限です。1 文字あたりの情報量が多い分だけ内容は詰め込めますが、「英語と同じ 280 字の枠を使える」という前提で残り字数の表示を実装すると、日本語入力で必ず食い違います。