• 締切済み

日本語が文字コードによってはエンコード出来ない?

以下のソースを実行したところ、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 ------------------

  • Java
  • 回答数5
  • ありがとう数0

みんなの回答

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.5

ANo.3の方が既に書いていますが、ISO-8859-1の文字集合は平仮名や片仮名を含んでいません。getBytes("ISO8859_1")の結果の配列が ? ばかりになるのは正しい動作です。日本語の文字列をgetBytes()したい場合は日本語の文字を含むエンコーディングを指定してください。 「正常動作する端末がある」と書かれていますが、ISO8859_1で日本語が文字化けしない端末があるのならそちらが間違っています。 引数を指定しないgetBytes()ではデフォルトエンコーディングが使われます。Windowsの日本語環境ならMS932がデフォルトなので、getBytes()はgetBytes("MS932")と同じ意味になります。Linuxとか英語版Windowsだとデフォルトエンコーディングは異なります。

回答No.4

プロパティか・・・。 native2asciiとかぐぐってみてください。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

元の文字列は ISO-8859-1 で表現できません. あきらめてください.

参考URL:
http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#getBytes%28java.lang.String%29
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

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

banshibo
質問者

補足

言葉足らずで申し訳ありません。 文字化けさせずに、「ほげもがフンコロガシ」と出力させたいのです。 というか、出力されるハズなのですが、出力されないので質問させて頂きました。 もう少し正確に補足させて頂きます。 既存のWebAPのプロパティファイルからの日本語読み込む処理において、 上記のように文字コードを変換しており、正常に動作しております。 しかし、私の環境に移行したところ、出力結果に文字化けが発生しました。 ソースを追って、getBytes()までたどり着いたのですが、 文法や使用方法に誤りがなさそうなことと、正常動作する端末があることから、 環境のどこかがおかしいと思うのですが、見当が付かず、こちらで質問させて頂きました。 Webサーバや設定との原因切り分けのために、質問にあるようなサンプルを作ってみたのですが、 私の環境ではgetBytes()でおかしな挙動をしています。 他にこの環境情報が必要ということであれば、仰ってください。 確認して補足致します。 --なお、文法や使用方法について確認する際に見たサイトは以下の通りとなります。 http://hisa-net.ddo.jp/php/java/encode.php http://hp.vector.co.jp/authors/VA017148/java/encoding.html

回答No.1

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

banshibo
質問者

補足

確認しました。 ----- System.out.println( new String(str.getBytes("ISO8859_1"), "ISO8859_1")); ----- 上記の様にしても、事象は変わらず、「??????????」と羅列されます。 どうも、getBytes("ISO8859_1")から帰って来たバイト配列を見ると、 全て「63」、アスキーコード表でみると「?」なので、この関数の時点でおかしくなっているようです。

関連するQ&A

  • JISコード変換について

    String str = "アイウエオ"; byte test[] = moji.getBytes("ISO2022JP"); String ret = new String(test); 上記のプログラムで半角カナをJISコードに変換すると 文字化けしているのですが、文字化けしないようにするにはどうしたらよいでしょうか。 なお、JISコードの String test = "アイウエオ"; ← "アイウエオ"はJISコード(文字化け無しの半角カナ文字) String ret = new String(test .getBytes("ISO2022JP"),"JISAutoDetect"); これで、文字化けせずUnicodeに変換できたのですが、単純に逆に変換しただけでは、半角カナの文字は、JISコードに変換すると文字化けしてしまうのでしょうか? どなたか教えて頂けないでしょうか?

    • ベストアンサー
    • Java
  • テキストBOXから取得した文字コードの扱いについて

    JSPで記述したページのテキストBOXに入力されたSJIS形式の日本語文字データをサーブレットに送信してそれを取得して、文字のエンコードを行う際に気がついたのですが String text = request.getParameter("text"); byte[] bytes =text.getBytes("ISO8859_1"); text=new String(bytes, "SJIS"); のようにすればサーブレットで扱う時に正しく日本語表示できるのですが String text = request.getParameter("text"); byte[] bytes =text.getBytes("SJIS"); text=new String(bytes, "SJIS"); とすると正しく表示されません。 text.getBytes("SJIS");で取得格納されるbyteのデータに違いがあるようです。この場合取得されるbyteの配列は3つになっています。 ISO8859_1で取得するとbyte配列は2つになっています。このISO8859_1のbyte配列のデータと同じ中身のものを単にString(byteデータ,文字コード)のコンストラクタに入れるとSJISの文字コードで正しく変換出来ています。 要するにもともとSJISの文字データをgetByte("SJIS")で変換したものがなんで、もとに戻せないのかということです。また、違う文字コードのISO8859_1ではSJISに対応したbyteの配列になるのかということです。 ひどい乱文ですみませんが、よろしくお願いします。

  • エンコード指定でコンパイルエラー

    以下のソースで、UnsupportedEncodingExceptionと、 コンパイルエラーが発生します。 byte[] sjisBytes; // 適当なバイト列を入れる String string = new String(sjisBytes, "Shift_JIS"); // エラー String s; // 適当な文字列を入れる byte[] b = s.getBytes( "Shift_JIS" ); // エラー サポートされている他のエンコーディング(UTF-8など)を入れても、 同じエラーになります。 原因がわかる方いらっしゃいますでしょうか?

    • ベストアンサー
    • Java
  • JAVA 文字コード変換

    こんにちは。 JAVAの文字コード変換のところで教えて頂きたい所があります。 はしご高(髙)  の文字をUTF-8からJISコードに変換してテキストファイルに書き込んでいるのですが、文字化けして"?"という文字になっています。 "髙"の文字をUTF-8からJISコードに変換の仕方のコーディング方法を教えて頂けないでしょうか。 現在下記の様に変換を行って書き込んでいます。  String str = "髙";  byte[] buf = str.substring(0, 1).getBytes("JIS0208"); OS:WindowsXP DB:Oracle10g  宜しくお願い致しますm(__)m

    • ベストアンサー
    • Java
  • byte[]→String変換後の文字列が違うのはなぜ?

    byte[]→String変換の処理を行っていたのですが、 使うメソッド(コンストラクタ)によって結果が違ってきます。なぜだかよくわからないのですが、どなたかご説明していただけないでしょうか。 byte[] bt; String str1 = "12345", str2; bt = str1.getBytes(); (1)str2 = new String(bt); (2)str2 = bt.toString(); (1)の方法と(2)の方法では答えが違ってきます。(1)では"12345"でしたが、(2)ではなんだか記号などまざったぐちゃぐちゃな文字列でした。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • MySQLのblob型の日本語文字列を取得すると文字化けする

    MySQLに接続し、Blob型の日本語データを取得したのですが、 文字化けしてしまいます。 new Stringを使っているのですが、うまくいきません。 今は以下のような流れになっております。 まずstr_orgにデータを格納して、次にnew Stringで変換してstr_chgに格納しております。 しかしstr_chgの文字列が文字化けしてしまいます。 何が原因か分かりますでしょうか? ちなみに現在は、my.confで[default-character-set=]の設定はは行なっておりません。 String url = "jdbc:mysql:///DATABASE?useUnicode=true"; String usr = args[0]; String pwd = args[1]; Srting key = args[2]; Connection con = DriverManager.getConnection(url,usr,pwd); PreparedStatement pstmt; pstmt = con.prepareStatement("SELECT * from quote_hdr WHERE qh_id = ?"); pstmt.setString(1,key); rs = pstmt.executeQuery(); String str_org = rs.getString("qh_cmts"); String str_chg = new String(qh_cmts.getBytes("8859_1"));

  • EUC_JPの文字化け

    指定された文字列(String型)を以下の様にバイト配列で保持し、 byte[] work = "指定文字列".getBytes(encoding); そのバイト配列を使用し、再度、以下の様にStringを生成します。 new String(work, encoding); (作成したプログラムを添付したいのですが、文字数の関係で割愛します。) 指定文字列は機種依存文字(丸数字等)にします。 この時、encodingにMS932、UTF-8等を指定した場合は問題なく元の文字列が 取得できますが、EUC_JPを指定すると、?に文字化けを起こします。 調査すると、getBytesでbyte配列を取得した時点で既に変換不良を起こしていました。 (丸数字全てが0x3fになっていました。期待していたコード、というか本来は、0xADA1~0xADB4のはずです。) そこでStringクラスのgetBytesメソッドをオーバーライドしちゃえという、甘い考えが浮かび、 javaのソースコードでString.javaを見ましたが、結局のところ、どこでコード変換を行っているのか よくわかりませんでした。 そこで質問です。 1)これはJDKのバグなのですか? 2)こんな経験がある。あるいはこういう対処をした。というかた、おりましたら、   参考URLでも構いませんが教えてください。 以上、よろしくお願いします。

  • サーバーサイドJAVAの文字エンコーディングについて

    はじめまして。JAVAの初心者です。質問があります。 HTMLフォームで日本語をJSPに送信してJSPページで setCharacterEncoding()メソッドを使用すると、 文字化けは回避できるのですが、 String s = new String(str.getBytes("ISO-8859-1"),"Shift_JIS") でsを表示すると文字化けします。sを表示して文字化けをしないため には、何か設定が必要なのでしょうか?どうかご教授をお願いします。 現在の環境はプラットフォームがWindowsXPで、JavaコンテナがTomcat5.5.17を使用し、JDK1.5を使用しています。

    • ベストアンサー
    • Java
  • Stringオブジェクトの文字コードの変換

    NewString = new String(b.getBytes("iso-8859-1"),"Shift_JIS"); でShift-Jisに変換できるとありましたが、どうも出力の 日本語部分が3Fになってしまってうまくいきません。 テスト用に以下のコードを作ってみました。 import java.io.File; import java.io.FileWriter; import java.io.BufferedWriter; import java.io.IOException; import java.io.FileOutputStream; public class Test { public static void main(String[] args) { try{ String regex_title; regex_title = "制限をしている場合"; System.out.println(getHexString(regex_title.getBytes())); System.out.println(getHexString(regex_title.getBytes("iso-8859-1"))); regex_title = "制限をしている場合"; regex_title = getUTF8(regex_title); System.out.println(getHexString(regex_title.getBytes())); System.out.println(getHexString(regex_title.getBytes("iso-8859-1"))); regex_title = "制限をしている場合"; regex_title = getShiftJIS(regex_title); System.out.println(getHexString(regex_title.getBytes())); System.out.println(getHexString(regex_title.getBytes("iso-8859-1"))); FileOutputStream fs = new FileOutputStream("./test.txt"); fs.write(regex_title.getBytes()); fs.close(); }catch(Exception ex){ } } public static String getHexString(byte[] b){ String buff=""; try{ for(int i=0;i<b.length;i++) buff += String.format("\\x%02x", b[i]); }catch(Exception ex){ } return buff; } public static String getUTF8(String b){ try { //UTF-8へ変換 return new String(b.getBytes(), "UTF-8"); } catch (Exception e) { e.printStackTrace(); return b; } } public static String getShiftJIS(String b){ try { //UTF-8へ変換 return new String(b.getBytes(),"Shift_JIS"); } catch (Exception e) { e.printStackTrace(); return b; } } // @Override } //////////////////////////////////////////////////////////// 1. System.out.println(getHexString(regex_title.getBytes("iso-8859-1"))); の部分の出力をみると3Fに変換されています。 regex_title.getBytes("iso-8859-1")の時点で3Fな事がわかります。 何故でしょうか? 私がやりたい事はStringの内部のコードをUTF8にする事です。 NewString = new String(b.getBytes("iso-8859-1"),"UTF-8"); では、出来ていないようでした。 2. また、以下のコードを実行するとtest.txt test2.txtともに 文字コードがShiftJisで出力されるのはなぜでしょうか? 変換を行わなければ内部処理形式のUnicodeで出力されるの ではないのでしょうか? regex_title = "制限をしている場合"; FileOutputStream fs = new FileOutputStream("./test.txt"); fs.write(regex_title.getBytes()); fs.close(); File file = new File("./test2.txt"); BufferedWriter bw = new BufferedWriter(new FileWriter(file)); bw.write(regex_title); bw.close(); 上はgetBytes()が変換してるのでしょうか? 下はBufferedWriterかFileWriterが変換してる? ではString内部のByteをそのまま出力するにはどうしたら・・・。

    • ベストアンサー
    • Java
  • DBから取得したデータの文字化け

    Java初心者です。 (確認したい内容) ServletからMySQLのデータを取得したResultSetの項目で、2バイト文字が文字化けしていました。 私自身で調査した結果、 str = new String(str.getBytes("ISO-8859-1"), "JISAutoDetect"); ※str…文字化けしている項目 のコーディングで文字化けが解消されました。 しかし、この対応だと全ての2バイト文字に対して、このコーディングを入れなければなりません。 これはスタンダードなコーディングなんでしょうか? それとも環境周りの設定一発で不要になるものなんでしょうか? 私自身の周りに先生がいないため、自分の書いてるコーディングに自信がありません。 ご意見よろしくお願いします。 (環境) WinXP-Pro-SP1 j2sdk4.1.2_05 Tomcat4.1.24 Eclipse2.1.3 MySQL4.1.7

    • ベストアンサー
    • Java

専門家に質問してみよう