2015年7月14日火曜日

Javaでメインフレームの文字コード変換するには

はじめまして、寺田と申します。



今回からこのブログのライターに加えていただきました。私も端末エミュレーターのソフトウェア開発を担当していますが、私の場合は、Javaで開発しています。そこで、私からは、メインフレームとJavaという話題を中心に投稿していこうと思います。

最初のお話は、Javaでメインフレームの文字コードを変換する方法についてです。
Javaの内部文字コードはUnicodeなので、メインフレーム文字コードとUnicodeの変換ということになります。

Javaで文字コード変換を行う場合、例えば、Unicodeの文字列をシフトJISのバイト配列に変換するには、次のようにStringクラスのgetBytesメソッドを使います。

 try {
     String unicode = "あいうえお";
     byte[] sjis = unicode.getBytes("Windows-31j");
 } catch(UnsupportedEncodingException e) {
 }

getBytesメソッドの引数には、変換したい文字コードのエンコーディングを指定します。シフトJISに変換するなら"Shift_JIS"を指定しても良いのですが、予期せぬ文字化けを防ぐには、"Windows-31j"を指定するのが無難です。getBytesメソッドの戻り値は、シフトJISに変換された文字列のバイト配列となります。ダンプ出力すると、次のようになります。

 82 a0 82 a2 82 a4 82 a6 82 a8

また、シフトJISのバイト配列をUnicode文字列に変換するには、次のようになります。

 try {
     byte[] sjis = {(byte)0x82, (byte)0xa0, (byte)0x82, (byte)0xa2, (byte)0x82,
                    (byte)0xa4, (byte)0x82, (byte)0xa6, (byte)0x82, (byte)0xa8};
     String unicode = new String(sjis, "Windows-31j");
 } catch(UnsupportedEncodingException e) {
 }

結果は、元の「あいうえお」になります。

Javaには、さまざまなエンコーディングが用意されており、上記のように変換したい文字コードのエンコーディングを指定するだけで文字コード変換ができます。

では、IBMメインフレームの文字コード、つまり、1バイト文字のEBCDIC、2バイト文字のIBM漢字コードも同様に変換することができるのでしょうか?

この話の流れからすると、「変換できる」が答えになります。Javaには、ちゃんとエンコーディングが用意されています。それが、Cp930 と Cp939 です。

例えば、Unicodeの「ibm漢字コード」を Cp930 で変換すると、

 try {
     String unicode = "ibm漢字コード";
     byte[] ibm = unicode.getBytes("Cp930");
 } catch(UnsupportedEncodingException e) {
 }

結果は、次のようになります。

 71 63 75 0e 4f 58 48 f2 0f 8a 58 95 be

逆に、このIBMの文字コードを Cp939 を使ってUnicodeに変換すると、

 try {
     byte[] ibm = {(byte)0x71, (byte)0x63, (byte)0x75, (byte)0x0e, (byte)0x4f,
                   (byte)0x58, (byte)0x48, (byte)0xf2, (byte)0x0f, (byte)0x8a,
                   (byte)0x58, (byte)0x95, (byte)0xbe};
     String unicode = new String(sjis, "Cp939");
 } catch(UnsupportedEncodingException e) {
 }

結果は、「サウソ漢字テーn゙」となります。

ん?最初の「ibm漢字コード」にならないですね。なぜでしょう?
それは、Cp930とCp939の違いにあります。

Cp930は、端末エミュレーターの文字コードの指定で言うところの「英数カナ拡張」、IBM i(AS/400)のCCSIDでは5026に該当します。一方、Cp939は「英数小文字拡張」、CCSIDは5036に該当します。つまり、1バイト文字のEBCDICが「英数カナ」なのか「英数小文字」なのか、CCSIDが5026なのか5036なのかで、Cp930とCp939のどちらを指定すればよいかが決まります。

ということで、IBMメインフレームの文字コード変換は、Javaでは簡単にできます。では、富士通や日立のメインフレームの文字コード変換もJavaでできるのでしょうか?

それは、次回にお話したいと思います。


0 件のコメント:

コメントを投稿