「漢字1文字は2バイト」という常識が、大きく変わろうとしている。現在改正中の「常用漢字表」に対応するためには、Unicodeの4バイト文字を使用する必要があるが、それだけでは済まない恐れがある。今後、戸籍や住民基本台帳で使われている文字がUnicodeに追加されると、漢字1文字が最大8バイトになるかもしれない。文字コードに詳しい京都大学人文科学研究所附属東アジア人文情報学研究センターの安岡孝一准教授が、問題の核心を解説する。(日経コンピュータ)

 先日公開した『新常用漢字表が迫るUnicode移行、「シフトJIS」では対応不可能』の読者から、「今後のシステムでは漢字1文字を最大4バイトで処理すればいいのか」という質問を頂いた。実は、UTF-8あるいはUTF-16で漢字を表す場合、最新のUnicodeにおけるIVS(Ideographic Variation Sequence)を考慮すると、漢字1文字は必ずしも4バイト以内に収まらない。UTF-8でもUTF-16でも、最悪8バイトは必要になると考えられる。どのような場合に4バイトを超えてしまうのか、解説しよう。

 地名や人名の漢字を扱う際には、微妙な字体差が問題となる場合がある。例えば、東京都飾区と奈良県城市は、それぞれ「」(艸かんむりに曷)と「」(艸かんむりに日に匂)を正式な行政区画名称に用いている。東京都飾区と書いても、あるいは奈良県城市と書いても、間違いとはみなされないが、それは正式な行政名称ではない(本記事では読者のパソコンに特定のフォントが組み込まれている場合に、それぞれの文字が異なる字体で表示されるようになっている)。

 ところが旧来のUnicodeは、「」(艸かんむりに曷)と「」(艸かんむりに日に匂)をU+845Bに統合しており、二つの文字を書き分けられない。つまり、UTF-16の「845B」という文字コードは、「艸かんむりに曷」と表示されるのか「艸かんむりに日に匂」と表示されるのか分からない、というのが実情である。

 この状況を打開すべくUnicode 5.1で導入されたのがIVSだ。IVSは、漢字を表すUnicodeの直後に、Variation Selectorと呼ばれるコードを付加し、漢字の異体字を表現する方法である。例えば「」(艸かんむりに日に匂)は、U+845Bの直後にU+E0100というコードを付加する。UTF-16であれば、サロゲートペアを使って「845B DB40 DD00」という6バイトになるし、UTF-8であれば「E8 91 9B F3 A0 84 80」という7バイトになる。一方の「」(艸かんむりに曷)は、U+845Bの直後にU+E0101を付加する。UTF-16であれば「845B DB40 DD01」という6バイトになるし、UTF-8であれば「E8 91 9B F3 A0 84 81」という7バイトになる(表1)。

表1●新しい常用漢字表の字体差とIVS
表1●新しい常用漢字表の字体差とIVS
Unicode 5.1で導入されたIVS(Ideographic Variation Sequence)を使用すると、異字体を使い分けられるようになる
[画像のクリックで拡大表示]