【文字化けより深刻】文字なし(?)対応

 文字化けは作成者の文字コードと使用者の文字コードの違いによって発生するものです。例えば「UTF-8」で作成されたテキストファイルを「SJIS」で使用すると当然文字化けが発生します。
 こういった場合、単純に使用する文字コードを「UTF-8」に変換にすればいいだけの話です。
 ところが、このとき「?」「・」になってしまう文字があります。これが「文字なし」です。
 長くシステムに携わっていると、必ずこの「文字なし」問題に悩まされることがあります。 特に現場では氏名についてこの問題が起こりやすいです。印刷すると「?」になっていたというように、思いがけず問題になることがあります。
 多くのサイトではこのような文字をエントリー段階で防ぎ、登録できないように制御しますが、特に氏名についてはどうしてもそのまま登録しなければならないケースもあります。
 そんな、文字化けよりも深刻な「文字なし」についてまとめたいと思います。  

1.「文字なし」となるパターン

1-1.文字コード変換により、文字が存在しない場合

 主要な文字コード。UTF-8、EUC-JP、SJISの変換で発生する件数をまとめると以下の通りです。

 先に結論ですが、UTF-8(UTF-16)を使用しましょう。全ての文字を網羅しており、「文字なし」の原因になりません。

 「文字なし」となる件数については、あくまで目安程度に考えて下さい。どこまでのUnicodeの範囲を比較の対象にするのか、何のフォントを使用するかによって大幅に件数が変わるからです。

 下表の件数については、件数の根拠をまとめてしていますので、興味のある方は確認して下さい。


UTF-8 EUC-JP SJIS
UTF-8 → - 有:(調査中) 有:
18,867/26,347文字
EUC-JP → - 有:(調査中)
SJIS → -

※UTF-8:Unicodeの意味でUTF-8と云っています。符号化まで考慮するとややこしいばかりなので、
 ここでは言及しませんが、当然UTF-16も同様の結果になります。

※SJIS:ここではCP932のことをSJISと表現しています。厳密なSJISでいうとさらに増えることになります。


 UTF-8 → SJIS 変換で「文字なし」になる18,867文字の詳細

~ UTF-8 → SJIS 変換で「文字なし」になる18,867文字 ~

1-2.Vista以上で追加された文字をXP以下で見る場合

 Windows Vista以降、Windows XPに比べて約900文字追加されました。これによりWindows Vista以降で作成されたドキュメントをWindows XPで見た場合「文字なし」が発生します。

 対象は以下の6フォント(MS明朝、MS P 明朝、MSゴシック、MS P ゴシック、MS UIゴシック、メイリオ)です。

追加された文字は「驒」「㐂」「沪」「𡈽」「琢」「簞」「吞」等です。

1-3.ユーザーが作成した外字、販売されている外字の場合

 当然、ユーザーが作成した外字、販売されている外字をインストールした場合は端末に依存し、別端末で見た場合、「文字なし」となります。
 XP当時は、氏名を入力する場合に文字が足りず、自分で外字を作成したり、外字パッケージ製品である「ダイナフォント」等をインストールしたりしていましたが、「文字なし」となるリスクが大きい手法であることと、Windows Vista以降の文字追加により、最近あまり外字は利用されなくなりました。

2.「ちょっと違う文字」となるパターン

2-1.Vista以上でフォントフェイスが変更された文字をXP以下で見る場合

 この件は有名な話で、Vistaリリース後は特に大混乱になりました。2017年現在でも、今だにその混乱が続いています。

上記「辻」を含む122文字が「ちょっと違う文字」になります。

 対象は以下の6フォント(MS明朝、MS P 明朝、MSゴシック、MS P ゴシック、MS UIゴシック、メイリオ)です。

~ 「ちょっと違う文字」になる122文字 ~

溢淫厩噂恢晦徽汲卿僅櫛屑倦捲巷榊杓哨摺撰噌揃樽歎捗擢堵屠叛廟庖儲愈冤喩嘲囀扁槌楢樋榔牙祇笈祁甑灼煎煽穿瀦溺瀞灘禰秤瀕瞥漣煉疼猷芦茨葛翰翫薩薯藷蛸蝕箭腿箸蔽蔑篇蓬籾簾筵篝逢迂襖迦諺逗詮遡遜辿註辻賭遁謎這逼謬豹迄訝飴鰯餌鞄饗鵠鯖錆酋鎚鄭鱒餅鑓騙鴉鞘


~ 参考:何故こんな混乱となったのか ~

 日本語の規格についてJIS90→JIS97→JIS2000→JIS2004というように都度改定が加えられています。
 このJISに対しXPではJIS90に準拠していましたが、「Vista以降JIS2004に対応するために、この122文字についてフォントフェイスを変更した。」というマイクロソフトからのアナウンスなのですが、 何故JIS委員会は、今更混乱を招く可能性の高い字体の変更を行う必要があったのか、何故マイクロソフトは大手フォント会社と同じく、「MSゴシック、MSゴシックN」というようにJIS90のフォントとJIS2004のフォントを分けず上書きしてしまったのか、今でも言われています。
 因みに、混乱を緩和するためマイクロソフトからJIS90に対応させるモジュールが配布されましたが、Windows7までで、Windows8以降は配布されません。

2-2.Unicodeの類似変換の場合

 UTF-8 → SJIS 変換において、環境により、以下の図のように「文字なし」とならず類似文字に変換されてしまうことがあります。


 ~ Unicodeの類似変換の例 ~ 

Unicode 文字(元) SJIS 変換文字
00C0 À 0x41 A
00C1 Á 0x41 A
00C2 Â 0x41 A
00C3 Ã 0x41 A
00C4 Ä 0x41 A
00C5 Å 0x41 A

 この例では、ラテン文字のアクセント記号付について、該当する文字コードがSJISにないため、類似のラテン文字に置き換わっています。アメリカでは基本、アクセント文字を使用しませんので、問題の無いケースかもしれませんが、イギリスではアクセント記号を使うので問題になるかもしれません。

3.「全く違う文字」となるパターン

3-1.CP932とSJISの差分。機種依存文字

 この件はもう過去の事になるかもしれません。UTF-8を使用すれば、何等、問題のない話です。
 SJISの際は、以下のとおり注意して下さい。

「SJISとCP932」の違い

 先ずこの件を理解するために「SJISとCP932」の違いを認識する必要があります。
 元々SJISという文字コードがあり、マイクロソフトがSJISをOSの標準文字コードに採用した際に、「コードページ 932 (CP932)」という管理番号を与えられました。
 単にWindowsに採用されたSJISの管理番号がCP932だというだけの話で、「SJIS=CP932」であり、本来、何等CP932という呼び方自体、意識する必要はありませんでした。
 ところが、いろいろな変遷がありいくつか独自に文字が追加されてしまい、「CP932>SJIS」になってしまいました。

 ~ 参考 追加された文字~
 ・JIS X 0208の非漢字(1983年追加文字)の一部(重複10文字)
 ・NEC特殊文字(重複22文字)
 ・NEC選定IBM拡張文字(374文字)
 ・IBM拡張文字(388文字)

 これにより、CP932は「Windowsの使用するSJIS」として通常のSJISと区別されるようになりました。
 それでも少し文字が増えている程度なので、通常は特にCP932と呼ぶこともなく、SJISと呼ばれています。

「全く違う文字」となるパターン

 このときMACも一部フォントでSJISを採用したのですが、同様に文字を追加する際、連携せずに各々違う文字コードに割り振りました。
 マイクロソフトとアップル、別メーカーの話ですし、確かに合わせるいわれはない話なのかもしれません。
 ただ、結果的には、SJISの拡張部分いわゆるCP932とSJISの差分についてWindows、Mac等機種により違う文字が表示されることが、あり得るようになりました。

 ~ 「全く違う文字」となる例 ~ 

SJIS 文字(Windows) SJIS 文字(MAC)
8740 8740
8741 8741
8742 8742
8754 8754
8755 8755
8756 8756


参考:件数の根拠

「1-1.文字コード変換により、文字が存在しない場合」の件数根拠です。
以下の条件、環境で件数を算出しています。


・対象としたUnicode範囲

 Unicodeは多言語文字コードであり、英語、日本語に加えてアラビア語、シリア語等、全世界の言語を全て包括する文字コードです。Unicode5.0にて10万語を既に突破しています。対してSJIS、EUC-JPに含まれるのは概ね英語、日本語だけです。

 このため比較対象をあわせるため、できる限り、英語、日本語、及び記号のみに絞るようにしています。

 具体的には、以下の通りですが、JIS X 0213の規定している文字を含むUnicodeの「文字ブロック」を網羅するようにしています。

 ~ 比較対象 26,347文字の詳細 ~ 

Unicode範囲 文字ブロック 対象
文字数
備考
0000~007F C0制御文字及び基本ラテン文字 94 制御文字:33文字除く
0080~00FF UnicodeのC1制御文字及びラテン1補助 94 制御文字:34文字除く
0100~017F ラテン文字拡張A 128
0180~024F ラテン文字拡張B 208
0250~02AF IPA拡張 96
02B0~02FF 前進を伴う修飾文字 80
0300~036F ダイアクリティカル・マーク 111 制御文字:1文字除く
0370~03FF ギリシア文字 129 表示不能:6文字除く
0400~04FF キリール文字 256
1E00~1EFF ラテン文字拡張追加 246 表示不能:10文字除く
1F00~1FFF ギリシア文字拡張 233
2000~206F 一般句読点 52 制御文字:22文字除く、表示不能:18文字除く、スペース等16文字除く
20A0~20CF 通貨記号 28 表示不能:4文字除く
2100~214F 文字記号 76 表示不能:4文字除く
2150~218F 数字に準じるもの 50 表示不能:10文字除く
2190~21FF 矢印 112
2200~22FF 数学記号 256
2300~23FF その他の技術用記号 215 表示不能:41文字除く
2400~243F 制御機能用記号 37 表示不能:2文字除く
2460~24FF 囲み英数字 160
2500~257F 罫線素片 128
25A0~25FF 幾何学模様 80 表示不能:16文字除く
2600~26FF その他の記号 110 表示不能:146文字除く
2700~27BF 装飾記号 160 表示不能:32文字除く
2900~297F 補助矢印B 128
2980~29FF その他の数学記号B 128
3000~303F CJKの記号及び句読点 57 表示不能:6文字除く
3040~309F 平仮名 93
30A0~30FF 片仮名 96
31F0~31FF 片仮名拡張 16
3200~32FF 囲みCJK文字・月 174 表示不能:21文字、韓国語囲文字59文字除く
3300~33FF CJK互換用文字 249 表示不能:7文字除く
3400~4DB5 CJK統合漢字拡張A 738 日本語(J~)の規定の無い5,844文字除く
4E00~9FEA CJK統合漢字 20,924 表示不能:47文字除く
F900~FAFF CJK互換漢字 98 KS X 1001:1998(韓国)における発音重複に基づくものでかつJIS X 0213に規定される7文字、IBM拡張文字32文字、JIS X 0213における包摂基準変更に基づく変更59文字対象
FE30~FE4F CJK互換形 32
FF00~FFEF 半角・全角形 173 半角ハングル52文字除く
20000~2A6D6 CJK統合漢字拡張B 302 JIS X 0213規定の302文字のみ対象


 表示不能:フォントは「MS ゴシック」(Vista以降)を使用しました。この為、例えばUnicode5.0以上はフォントに含まれていませんので、表示不能として比較対象から省きました。

おすすめの関連記事

Unicodeの符号化方式
UTF-16、UTF-8等、Unicodeの符号化方式について詳しくまとめました。