今回のお話は、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でできるのでしょうか?
それは、次回にお話したいと思います。
Rankingランキング
New arrival新着
Keywordキーワード