プロが教える店舗&オフィスのセキュリティ対策術

なんで、

String str = "あいうえお";
byte[] temp = str.getBytes("8859_1");
String str2 = new String(temp, "8859_1");
System.out.println(str2);

このコードが ????? を出力するかわかる方、おしえてください。

A 回答 (1件)

Harry_ さんの回答履歴を見る限り、あなたはこの質問の答えがわかっていて当然だと思うのですが……




8859_1 は、欧文用のエンコードですよね。半角英数字などの欧文用文字には対応していますが、日本語のひらがなや漢字には対応していません。ですから、日本語を 8859_1 エンコードで表そうとしても不可能です。

したがって、コードの2行目で getBytes メソッドの返すバイト配列は、この時点で
0x3f 0x3f 0x3f 0x3f 0x3f (?????)
になっています。

もちろん、3行目の 8859_1 エンコードによるバイト配列から Unicode の文字列に変換する作業はうまくいっています。ただし、引数のバイト配列の中身は、「?????」なのです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
8859-1エンコードには日本語文字も含まれていると
ずっと勘違いしていました。


>Propertiesクラスのloadメソッドは、ストリームをISO8859_1として
>読み込みます。この中で、バイト配列→Stringオブジェクトの誤った
>変換がなされているので、

回答履歴というのは、このことだと思います。
非常にはずかしい話ですが、8859-1が日本語を表すことができない、
という意味ではなく、単にMS932と異なるエンコードだから
誤変換している、というつもりで回答しておりました。
これに続いて書いた、ちゃんと動かないコードから私の勘違いが
見てとれると思います。
最近になって、そのコードがうまく動作しないことに気づき、
今回の質問をさせてもらうことにしました。
確認もしないで回答したことは、深く反省しています。

ありがとうございました。

お礼日時:2002/03/24 03:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!