ビジネス課題への解決策(アイディア)と、新たな発想(+α)が見つかるIT情報メディア

Menu
  1. TOP
  2. データ活用
  3. Javaでメインフレームの文字コード変換するには

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加

今回のお話は、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でできるのでしょうか?

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

メールマガジンの登録はこちらから
メルマガ登録 お問い合わせ