いつまでたってもエンジニアを悩ませる問題として「文字コード」があります。 その中でも質が悪いのが Microsoft ページコード 932 いわゆる Windows-31J だと思います。 Unicode がだいぶ普及したとは言え、まだまだ根深い問題です。 本稿では Shift_JIS と Windows-31J の違いについてまとめてみたいと思います。 とは言え筆者自身、Shift_JIS や Windows-31J などが誕生した当時にリアルタイムで歴史を見てきた人間ではありませんので、あくまで Wikipedia をベースに筆者なりにまとめたという点をご了承ください。 (誤りがあった場合にはご指摘頂ければ幸いです)
解説資料
解説に先立って解説内容を図に表しました。 下図を見ながら解説を読み進めて貰えればと思います。
Shift_JIS (CP932) の誕生
Shift_JISは、漢字を含む日本語を表現できる文字コードとして1982年に誕生しました。 Shift_JIS はマイクロソフトの MS-DOS における標準日本語コードとして採用されました。 その際に「コードページ 932 (CP932)」という管理番号が与えられたとのことです。 つまりこの時点で Shift_JIS と CP932 は全くイコールのものです。
企業拡張された CP932 の誕生
マイクロソフトはマイクロソフトのOSをインストールしたコンピュータを販売する企業に CP932 の拡張を許していました。 そのため、NEC や IBM などの企業が独自に拡張した CP932 を搭載したコンピュータが世の中に出回ることになります。
CP932 の統合
1993年にマイクロソフトは Windows 3.1 をリリースするにあたり、独自にコンピュータメーカが CP932 を拡張する事を禁じ、当時コンピュータの大きなシェアを持っていた NEC と IBM が独自拡張した CP932 を統合することにし、この統合した CP932 を Windows の標準日本語コードとすることにしたのです。 また、マイクロソフトはこの統合された CP932 を、インターネット上の資源を管理・標準化している IANA に「Windows-31J」という名称で登録したのです。
このように CP932 は多くの拡張があるため、Java の世界ではこの最終的に統合された CP932 を「MS932」と呼ぶことしました。
まとめ
以上の歴史的背景より、要点を下記にまとめます。
- Windows-31J と MS932 は同意である。 (統合された CP932 を指している)
- Windows-31J (MS932) は、Shift_JIS を拡張した文字コードである。
- Shift_JIS と Windows-31J では、当時 NEC と IBM が拡張した文字が追加されていることに違いがある。 (「NEC特殊文字」「NEC選定IBM拡張文字」「IBM拡張文字」が追加されている。)
エンジニアとしては「Shift_JIS」という言葉で意思疎通をしていたとしても、念のため実際には「Windows-31J (MS932)」ではないかを確認しながら開発を行った方が良いでしょう。 「Windows = Shift_JIS」という方程式は正しくないのですから。
拡張された文字で代表的なものを上げれば、「髙 (はしご高)」や「﨑 (立ち崎)」などがあります。 Shift_JIS と Windows-31J の使い分を誤ったばかりに文字化けが発生しますので注意が必要です。