CJK (中日韓統合漢字)

中国語・日本語・韓国語で共通する漢字を Unicode で統合的に扱う体系。CJK Unified Ideographs。

CJK は Chinese (中国語)・Japanese (日本語)・Korean (韓国語) の頭文字で、これら 3 言語で共通する漢字体系を指します。Unicode では CJK Unified Ideographs として統合的にコードポイントが割り当てられています。中心となるブロックは基本多言語面 (BMP) の U+4E00 から U+9FFF までで、20,992 個のコードポイントを持ちます。これに拡張 A から拡張 J までのブロックが加わり、2025 年 9 月に公開された Unicode 17.0 では拡張 J として 4,298 字が追加されて、CJK 統合漢字の総数は 10 万字を超えました。

Han Unification (漢字統合) は CJK の核心的な設計方針です。中国の簡体字・繁体字、日本の漢字、韓国の漢字のうち、歴史的に同一の起源を持つ文字には同一のコードポイントが割り当てられます。たとえば「直」という字は日中韓で微妙に字形が異なりますが、Unicode では同じ U+76F4 です。フォントの選択によって字形が変わるため、HTML の lang 属性を正確に指定してブラウザに適切なフォントを選ばせることが重要です。

CJK 文字は全角幅で表示され、BMP にある漢字は UTF-8 で 1 文字あたり 3 バイト、UTF-16 では 2 バイトを消費します。同じ 100 文字のテキストでも、英語 (ASCII) なら 100 バイト、日本語なら 300 バイト (UTF-8) と、文字数とバイト数の乖離が大きくなります。データベースの容量設計やネットワーク帯域の見積もりでは、この差を考慮する必要があります。注意が必要なのは拡張ブロックの扱いです。拡張 A は BMP にあるため 3 バイトですが、拡張 B 以降は BMP の外に置かれており、UTF-8 では 4 バイト、UTF-16 でもサロゲートペアとして 4 バイトになります。JavaScript の String.length はこれを 2 と数えるため、拡張漢字を含む人名や地名を受け付けるフォームでは、残り文字数の表示が見た目と 2 倍ずれます。

CJK テキストのもう一つの特徴は、単語間にスペースがないことです。英語では空白が単語の区切りとして機能しますが、日本語や中国語ではそのような区切りがありません。そのため、検索エンジンのインデックス作成や単語数カウントには形態素解析 (日本語の MeCab など) や N-gram 方式が必要になります。改行処理も英語とは前提が違い、CJK は原則として文字単位で折り返せる一方、行頭に来てはいけない句読点や閉じ括弧の禁則処理が必要です。CSS では line-breakword-break でこの挙動を調整します。

Han Unification に対しては批判もあります。日本語の「骨」と中国語の「骨」は字形が異なるにもかかわらず同一コードポイントが割り当てられているため、同一文書内で日中の字形を使い分けるには CSS の font-family やフォントフィーチャーの制御が必要です。Unicode の IVS (Ideographic Variation Sequence) はこの問題を部分的に解決する仕組みです。

文字数カウントの観点では、CJK は 1 文字が担う情報が多く、同じ内容が英語より少ない文字数に収まることがあります。ただし、それが投稿欄の有利さに直結するとは限りません。X (Twitter) では文字ごとに重みを付けて合計 280 という上限を判定し、日本語や絵文字は 1 文字が重み 2 として数えられるため、日本語だけの投稿は実質 140 文字で上限に達します。文字数が少なくて済む代わりに 1 文字が 2 と数えられる、という二重の換算が入るわけです。自分のサービスで文字数制限を設けるときは、CJK を 1 と数えるのか 2 と数えるのか、あるいは表示幅で判定するのかを先に決め、投稿先の数え方と食い違わないようにします。

この記事を共有