Shift_JISとMS932にハマったときの話
システム間でのデータ連携手法として基本的かつ使用頻度が高いものにファイル連携が挙げられると思う。近年ではWebAPI連携を使用するケースも増えつつありますが、個人的な印象としては、
- 比較的少量データをリアルタイム連携:WebAPI連携
- 大量データの定時連携:ファイル連携
を採用することが多い気がします。
そんなファイル連携で最近 ハマった落とし穴について。
What's Happened?
事象
- Shift_JISでWindows環境のシステムからテキストファイルを連携してもらい、ファイル内容をDBに取り込む機能を開発
- データ量を絞っての単体・結合テストはクリア
- 実データを用いた移行テスト実施時に、一部で文字化けが発生
原因
- ファイル取込時の文字コード指定が Shift_JIS となっていた
対応
- ファイル取込時の文字コード指定を Windows-31J(MS932) に変更
原因と対応方法を調べる中で、Shift_JISと当たり前のように使用していた言葉は、実は曖昧な表現で、システムやプログラミング言語によって異なるものを指していることを、恥ずかしながらこの時初めて知りました。
(ひょっとしたら常識なのかもしれないけれど、)このあたりの事情を歴史含め調べてみたので、簡単にまとめてみました。
Shift_JIS・CP932を巡る歴史
Shift_JIS(便宜上、ここでは旧CP932と呼ばせていただきます)は、1982年に漢字を含む日本語を表現する文字コードとしてMicrosoftが開発し、同社のOS MS-DOSの標準日本語コードとして採用されました。
ご存じ、MS-DOSはNECやIBMといった各メーカーが発売したPCに搭載され、バカ売れしたわけです。が競争下で戦いをより優位に進めるために、メーカー各社は、ユーザーからの要望に応えるカスタマイズを施しました。その過程でより広い日本語表現を実現するため、文字コードを各社独自に拡張してしまいました。例えば、名前で使用される髙(はしごだか)や、企業システムで時々お見掛けする ㈱ 等。これらは拡張CP932と呼ばれ、NEC拡張版・IBM拡張版等が世に広く出回り、互換性をめぐる混沌が発生したものと思われます。
この混沌を解消するため、Microsoftは、1993年 Windows3.1リリース時に、メーカーが文字コードCP932を拡張することを禁じると同時に、シェアの大きかったNEC・IBMの独自拡張をCP932に取り込みました。この統合版CP932をWindows3.1以降の標準日本語コードとし、新たに「Windows-31J」または「MS932」という名称を付与することで、互換性をめぐる混沌を解消しました。
後に残ったもの
現在、Windowsの世界で広くこの統合版CP932(=Windows-31J=MS932)Shift_JISと呼ぶことが多い一方、
Javaの世界では、旧CP932を(拡張部分が含まれない純粋な)Shift_JIS、拡張を含む統合版CP932をWindows-31J、またはMS932 と分けて呼んでしまっています。
そのために、一口に「Shift_JIS」といっても、この2者のように指しているものが違う場合がある、という新たな混乱(混乱しているのは私だけかもしれませんが)が生まれてしまう結果に。
じゃあ、具体的にどう注意すればよいか?100点満点の解をいまだ見出せていませんが、自分なりにまとめてみた。
- こういう事情があることを頭の片隅に置いておく
- 文字コード:Shift_JIS を指定された場合は、そのShift_JISが旧CP932(純粋なShift_JIS)・統合版CP932(MS932・Windows-31J)なのか確認する
- もし(過去の無知な私のように)この表現が通じないようであれば、人名・会社名(特に略称)が連携内容に含まれていないか確認する(これらには高確率で特殊文字が含まれているため、統合版CP932(MS932・Windows-31J)だと思っていたほうが安全)
- 使用するプログラミング言語やツールの文字コード選択肢の中に、Shift_JIS以外にMS932・Windows-31Jという単語が並んでいたら、後者が一般的に(広い意味で使用されている)Shift_JISと呼ばれているものと認識したほうがよい
結局は自身の担当システムの作り・データの要件、相手システムの作り等、諸々を考慮した判断が必要になるわけですね。
まとめ
- Shift_JIS という言葉は曖昧性を含んでいる
- Windowsの世界で一般的にShift_JISと呼ばれているものは、元々のShift_JIS(旧CP932)に拡張部分を統合したものを指す
- 他の世界では、Shift_JISは純粋なShift_JIS(旧CP932)を、拡張部分を含んだものはWindows-31J(MS932)と別の単語で表現される
- 両者を混在すると、一部特殊文字で文字化けが発生するため、注意が必要
新人の頃、知っているつもりになっていることが一番危ない、知っているつもりでも間違っていること・不足していること・変わってしまったことが必ずあるので、常にドキュメントやヘルプを見る癖をつけるよう言われてきたことを、いま思い出す。
参考文献
Comments