Unicodeの普及でこれまでJIS第1・第2水準では入力できなかった多くの人名が表記できるようになりましたが、実際に使ってみると「化ける」ケースはまだまだあります。では、それらの文字は何がどうまずくて化けているのでしょう。その理由は一通りではありません。日本語文字セットへの収載状況、Unicodeでの表現、その2軸でいくつかに分けて見てみましょう。
用語
※IBM拡張文字⋯JIS X0208-1978(“旧JIS”, “JIS78”)を拡張する形でIBMが自社マシン用に追加した漢字と記号。代表は「髙」。115〜119区という本来のJISコードの規格外の句点位置だがシフトJISでエンコーディング可能。日本語版Windowsにも採用され、この領域を含むシフトJISエンコーディングはWindows-31J, CP932, MS_Kanjiと呼ばれてShift_JISの亜種とされる(かなり雑な説明)。
※第3・第4水準漢字⋯JIS X0213-2000(“JIS2000”)で拡張された漢字領域。IBM拡張文字とは異なり、句点に加えて面という第3の桁を用意することで拡張した。シフトJISエンコーディングもそれに合わせて拡張したものを用意したが、このエンコーディングはIBM拡張文字に対応できないので実際にはほとんど実用されていない。ISO-2022-JPも拡張されているが、やはり実装例は少ない(同じく雑な説明)。
※追加面⋯16ビットで各国の文字規格を収容するのが無理と判明したUnicodeも面を増やして拡張された。UTF-16エンコーディングでは32ビットのサロゲートペアという表現方法を使うため、追加面の文字はサロゲートペア文字と呼ばれることが多い。
JIS第1・第2水準に含まれない文字の分類
IBM拡張文字に含まれる | 含まれない | ||||
---|---|---|---|---|---|
含まれない | 第3・第4水準漢字に含まれる | 含まれない | |||
JIS2004追加文字 | |||||
基本多言語面 CJK統合漢字 |
「髙」ほか84文字 ★1 |
「﨑」「彅」ほか276文字 ★2 |
「㐂」ほか多数 ★2 ★3 |
「繫」ほか9文字 ★4 |
「杮」ほか多数 ★5 |
追加面 (サロゲートペア文字) |
「𠀋」ほか302文字 ★2 ★3 ★6 |
「𠮟」1文字 ★4★6 |
「𠮷」ほか多数 ★5 ★6 |
||
CJK互換漢字 | 「羽」ほか11字 ★1 ★7 |
「塚」ほか16字 ★2 ★7 |
「琢」ほか59字 ★2 ★3 ★7 |
多数 ★5 ★7 |
化けどころ
★1: IBM拡張文字
WindowsでシフトJIS保存したテキストやISO-2022-JPエンコードしたメールが他環境でデコードできません。古くはWindowsの「①」がMacで「㈰」に化けていたあれ。
★2: 第3・第4水準漢字
ISO-2022-JPの拡張(ISO-2022-JP-3)でエンコーディングできてしまうのでMuleなどの環境からこのISO-2022-JP-3のメールが送れてしまうのですが、デコードできる環境が少なく化けたり読めなかったり。Windowsのメーラーは大体無理。
★3: IBM拡張文字に含まれない
WindowsはAPIをUnicode版と非Unicode版の2セット用意しており、日本語環境だと非Unicode版APIはシフトJIS(もちろん正確にはIBM拡張文字を含む亜種であるWindows-31J)で文字列を扱います。古いアプリほど非Unicode版APIを使っているので、IBM拡張文字に含まれない文字が「?」に化けます。
★4: JIS2004追加文字
第3・第4水準漢字が10文字増えただけですが、Windows XP以前の標準搭載フォントが字形を持っておらず豆腐になります。
そのせいもあって、この10文字をはじくミドルウェアが販売されていたり。 http://itpro.nikkeibp.co.jp/article/NEWS/20071207/289050/
★5: 第1〜第4水準にもIBM拡張文字にも含まれない
つまり日本語の文字ではないとされているわけで、日本語フォントに字形が含まれていないことが多く豆腐になりがちです(フォント次第)。しかし「𠮷」は日本の人名で普通に使うだろ⋯
ちなみに分類表ではまったく触れていませんが、JISには補助漢字(JIS X0212)という文字集合も定義されており、補助漢字には含まれているという字もこの分類に放り込んであります。「杮(こけら)」なんか。
★6: 追加面
UTF-16を使うプログラミング環境、Javaとか.NETとかJavaScriptとかWindows API(Unicode版)とかだと、追加面の文字だけ2文字で1文字扱い(雑な説明)なので、正しい取り扱いを入れていないと
- 文字が分断されて壊れる
- 文字数カウントがおかしい
- 検索結果がおかしい
- カーソルの動きがおかしい
など発生します。また、MySQLのUTF-8が追加面文字をエンコードできないという問題があります。
★7: CJK互換漢字
互換漢字とは平たく言うと、似た字が収載されているので本来Unicodeに収載されるべきではなかったが、別字として収載いる各国文字コード体系があるため互換のために収載しているという位置づけの漢字です。
互換漢字はUnicodeテキストを正規化する際に統合漢字のコードに置き換えるというルールになっています。
その正規化処理により、人名を正しく入力していたはずがテキスト処理の結果標準字体に置き換わってしまっているということが起こります。