今週、仕事の中で、ちょっと文字コードがらみではまったので、覚え書きとしてここにまとめてみる。
様々なシステムにおける文字コードの違い
世の中には様々なシステムがあり、そこには様々な文字コード体系が使われている。ざっと有名なところを挙げると、IBMの汎用機用1バイト文字コード体系であるEBCDIC、同じくアメリカで規格化された1バイトコードのASCIIなど。マルチバイトコードの場合は、JISで定められたJISコード、これをPCで扱いやすいようにマイクロソフトが変更したシフトJIS、同じくUNIXで扱いやすいようにAT&Tが変更したEUCなどがある。最近では、多国語を同一の文字コード体系で使用できるような文字コードとしてUnicodeの使用が進んでいる。
これらの文字コードを混在して使用することは原則としてできない(同一コードに異なる文字が割り当てられてしまうため)。そこで、文字コードを変換する作業が必要となってくる。
NEC ACOSシリーズ
さて、一般的な話はここまでにして、ここからが今回はまった問題。現在、俺が管理しているUNIXサーバ(OS:HP-UX 10.20)と、別会社が管理している汎用機、NEC ACOSシリーズ(詳しくは知らない)との間でテキストデータのやりとりをしている。
ACOSが使用している文字コード(2バイト)はJIPSというNEC独自のもの。一方HP-UXで使用している文字コードは、UNIXとしては珍しくShift-JISである。当然テキストデータのやりとりを行うには文字コードの変換を行う必要がある。
今までは文字コード変換ユーティリティを用いて自動的に行っていたのだが、顧客のシステム更新に伴い、そう簡単にはいかなくなってしまった。というのも、今までACOSから受け取っていたデータが、ACOSのバックにWindowsサーバが用意され、そこで作成したデータをACOS経由で受け取るという形に変更となったからだ。ACOSから受け取るという形は今までと変わらないため、プログラムの変更は行わなかった。そこまでは良かったのだが、次に挙げる問題のため、新たに作業を行う必要が発生したのだ。
文字変換の実際・トラブル編
実は、この変換ユーティリティ、JIS第一水準しかコード変換に対応していなかったのだ。第二水準以降や記号などは自分で変換テーブルファイルを用意しなければならない。今まではACOS側で第二水準の漢字を使用していなかったのだが、今回のシステム変更で、Windowsで使用している文字がそのまま流れてくるようになったため、第二水準もカバーする必要が出てきたのだ。
もちろんWindowsからACOSへのデータ送信もコード変換が必要となるため、最初はWindowsサーバを管理しているベンダーに頼んで変換テーブルをもらい、それをそのまま使用した。しかしこれがうまくいかない。同じユーティリティを使用しているのに。何度作り直してもだめ。何故だー!
文字変換の実際・解決編
実は、JIPSというコードには二種類あるらしい。内部的に使用しているJIPS(E)と、外部とのやりとりに使用するJIPSだ。先方からもらった変換テーブルにはJIPS(E)とShift-JISとの対応が書かれていたのだが、うちのシステムで使用しているユーティリティのバージョンではJIPS(E)には対応していなかったのだ。確かにマニュアルには「NECとのコード変換を記述するときにはJIPSをご使用ください」と書いてあったのだが、最初はJIPSが二種類あるとは知らずに「そんなの当たり前だろ」と読み飛ばしていたのだ。紛らわしい奴だ。
で、次に問題となるのはJIPS(E)からJIPSへの変換だ。こちらにはACOS関連の書類などほとんどないため、当然対応表なども存在しない。しかし、システム構築当時の資料を調べてみると、システム構築時、ユーティリティを作成した会社に質問をFAXで送信した記録が残っていた。どうやらシステム構築時も今回の俺と同じはまり方をしていたらしく、JIPSは対応しているがJIPS(E)は対応していないと言う旨の回答が書かれた後、変換手順としてEBCDIC(カナ)から8ビットJISへ1バイトずつ変換を行えばOKという回答が書かれていた。
そうなれば話は簡単、このユーティリティにも付属しているEBCDIC(カナ)→JIS8対応表を見て、1バイトずつ手で変換(2バイト文字なので1文字につき2回変換)していけばいいのだ。
文字変換の実際・攻略編
ところがこの対応表、あくまでもEBCDICとJIS8の対応表であるため、EBCDICで割り当てられていないコードには当然対応するJIS8のコードも書かれていないのだ。EBCDICは1バイトの領域全部(256種類)を使用しているわけではないので、結構隙間がある。その領域に出てきたコードはどう変換すればいいのだ。
というわけで、さくっとWeb上を調べてみると、やっぱりあった。EBCDICの変換ツールが。そのツールがこれ。各社のEBCDICコードを選ぶと対応するASCIIコード(カナ文字もあるので、正確にはJIS8。ASCIIは7ビットで定義されている)を教えてくれる。それにしても「各社」って。このソフトのreadme.txtにも書いてあったのだが、どうも元のコードを汎用機各社が独自拡張したおかげで、同じEBCDICを名乗っていても、ほとんど互換性はないようだ(互換性があるのは数字と英大文字、コントロールコードだけ)。迷惑な話だ。
このように試行錯誤を繰り返し、最終的には問題を解決することができた。その記念として、このように記録に残してみた。うーん勉強になったね。今後使うことはなさそうな知識だけど。