電子書籍の厳選無料作品が豊富!

以下のソースを実行したところ、getBytes()に渡す文字コードによっては、
「??????????」
というように文字化けをするのですが、原因を教えてください。

-----ソース-----
import java.io.UnsupportedEncodingException;
public class hoge {

public static void main(String[] args) {
String str = "ほげもがフンコロガシ";
try {
System.out.println( new String(str.getBytes("ISO8859_1"), "MS932"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}

}
---------------

-----出力結果-----
str.getBytes("ISO8859_1") の場合
「??????????」

str.getBytes("MS932") の場合
「ほげもがフンコロガシ」

str.getBytes() の場合(引数無し)
「ほげもがフンコロガシ」
------------------

-----環境情報-----
OS:WindowsXP_sp3(32bit)
Eclipse:Eclipse Java EE IDE for Web Developers(Helios Build id: 20100617-1415)
JRE/JDK:jdk1.4.1_06
------------------

A 回答 (5件)

ANo.3の方が既に書いていますが、ISO-8859-1の文字集合は平仮名や片仮名を含んでいません。

getBytes("ISO8859_1")の結果の配列が ? ばかりになるのは正しい動作です。日本語の文字列をgetBytes()したい場合は日本語の文字を含むエンコーディングを指定してください。
「正常動作する端末がある」と書かれていますが、ISO8859_1で日本語が文字化けしない端末があるのならそちらが間違っています。

引数を指定しないgetBytes()ではデフォルトエンコーディングが使われます。Windowsの日本語環境ならMS932がデフォルトなので、getBytes()はgetBytes("MS932")と同じ意味になります。Linuxとか英語版Windowsだとデフォルトエンコーディングは異なります。
    • good
    • 0

プロパティか・・・。



native2asciiとかぐぐってみてください。
    • good
    • 0

元の文字列は ISO-8859-1 で表現できません.


あきらめてください.

参考URL:http://download.oracle.com/javase/1.5.0/docs/api …
    • good
    • 2

いったいどういう結果を期待しているんだろう.

この回答への補足

言葉足らずで申し訳ありません。
文字化けさせずに、「ほげもがフンコロガシ」と出力させたいのです。
というか、出力されるハズなのですが、出力されないので質問させて頂きました。


もう少し正確に補足させて頂きます。
既存のWebAPのプロパティファイルからの日本語読み込む処理において、
上記のように文字コードを変換しており、正常に動作しております。
しかし、私の環境に移行したところ、出力結果に文字化けが発生しました。

ソースを追って、getBytes()までたどり着いたのですが、
文法や使用方法に誤りがなさそうなことと、正常動作する端末があることから、
環境のどこかがおかしいと思うのですが、見当が付かず、こちらで質問させて頂きました。

Webサーバや設定との原因切り分けのために、質問にあるようなサンプルを作ってみたのですが、
私の環境ではgetBytes()でおかしな挙動をしています。
他にこの環境情報が必要ということであれば、仰ってください。
確認して補足致します。

--なお、文法や使用方法について確認する際に見たサイトは以下の通りとなります。
http://hisa-net.ddo.jp/php/java/encode.php
http://hp.vector.co.jp/authors/VA017148/java/enc …

補足日時:2011/03/31 18:00
    • good
    • 0

エンコードとデコードで違う文字コードを指定しているからでは。

この回答への補足

確認しました。
-----
System.out.println( new String(str.getBytes("ISO8859_1"), "ISO8859_1"));
-----
上記の様にしても、事象は変わらず、「??????????」と羅列されます。

どうも、getBytes("ISO8859_1")から帰って来たバイト配列を見ると、
全て「63」、アスキーコード表でみると「?」なので、この関数の時点でおかしくなっているようです。

補足日時:2011/03/31 17:39
    • good
    • 0

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