Stringオブジェクトの文字コードの変換について

このQ&Aのポイント
  • Stringオブジェクトの文字コードの変換に関して、iso-8859-1での変換後に日本語部分が3Fになる現象が起きています。
  • UTF-8への変換を試みてもうまくいかず、内部のコードをUTF-8にすることができません。
  • また、ファイルへの出力においても、Shift_JISでの文字コード変換が行われており、Unicodeの内部処理形式で出力されない理由がわかりません。
回答を見る
  • ベストアンサー

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
  • 回答数1
  • ありがとう数6

質問者が選んだベストアンサー

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

> NewString = new String(b.getBytes("iso-8859-1"),"Shift_JIS"); > でShift-Jisに変換できるとありましたが、 この時点で既に前提が間違っています。 > regex_title.getBytes("iso-8859-1")の時点で3Fな事がわかります。 > 何故でしょうか? regex_titleはString型 (内部コードはUnicode) で、それをgetBytes()メソッドによってiso-8859-1のbyte配列に変換しています。iso-8859-1は西欧の文字コードなので、漢字やひらがなを表せません。getBytes()は、変換先の文字コードで表せない文字を見つけた場合はクエスチョンマーク (0x3F) に変換します。 すなわち、getBytes()の引数に"iso-8859-1"を指定していること自体が誤りです。 > 私がやりたい事はStringの内部のコードをUTF8にする事です。 JavaのStringオブジェクトの内部コードはUnicodeと仕様で決まっているので、UTF8やShift_JISにすることはできません。 StringオブジェクトからUTF8やShift_JISのbyte配列を作ることは、getBytes()でできます。 > 上はgetBytes()が変換してるのでしょうか? getBytes()を引数なしで呼ぶと、デフォルトの文字コードを引数に指定したのと同じ意味になります。日本語版Windowsであれば、デフォルト文字コードとしてはMS932 (Shift_JISの拡張版) が使われるはずです。他のOSや、他の言語環境ではまた違う文字コードが使われるでしょう。 > ではString内部のByteをそのまま出力するにはどうしたら・・・。 Stringの内部にあるのはchar型 (16進数で4桁) の配列であって、byte型 (16進数で2桁) の内部データは存在しません。char型のまま16進数で出力するなら、こんな感じ。 String str = "123ABC漢字"; int len = str.length(); for (int i = 0; i < len; i++) { char c = str.charAt(i); System.out.println(Integer.toString((int)c, 16)); } StringをUTF8のbyte配列に変換してから出力するならこうなります。 try { String str = "123ABC漢字"; byte[] b = str.getBytes("UTF8"); int len = b.length; for (int i = 0; i < len; i++) { System.out.println(Integer.toString(b[i] & 0xFF, 16)); } } catch (java.io.UnsupportedEncodingException e) { e.printStackTrace(); }

JavaJavax2
質問者

お礼

大変詳しいご説明ですごくよく分かりました。 おかげさまでやりたかった事ができました。 感謝いたします。 お手間のかかる回答本当にありがとうございました。!

関連するQ&A

  • String または byte[]を16進に変換するには

    String または byte[]をデバッグ目的で16進に変換するには、1文字ずつ処理すればいいのですが、ヘキサ表示なんてだれもが行うものですからすでにライブラリ化されていないでしょうか? sun.misc.HexDumpEncoder クラスは見つけたのですが、このほかに16進変換に使えるクラスはありませんでしょうか。(apache-commonsなら安心して使えるのでうれしいです) HexDumpEncoder encoder = new HexDumpEncoder(); String encoded = encoder.encode("abcde".getBytes()); System.out.println(encoded); 出力 0000: 61 62 63 64 65 希望としては 0000:  は不要なので 61 62 63 64 65 6162636465 0x6162636465 などに変換できると助かります。

  • Java・ファイルへの書き込み

    はじめまして。 下記のプログラムで、以下の3つがどのような関係なのかがわかりません。 ("test1.txt")とnew FileWriterの関係 (new FileWriter("test1.txt")とnew BufferedWriterの関係 (new BufferedWriter(new FileWriter("test1.txt")と new PrintWriterの関係 どうかご教示いただきたく、よろしくお願い致します。 import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; public class Sample7 { public static void main(String[] args){ PrintWriter pw = null; try{ pw = new PrintWriter (new BufferedWriter(new FileWriter("test1.txt"))); pw.println("Hello!"); pw.println("GoodBye"); System.out.println("ファイルに書き込みました。"); }catch(IOException e){ System.out.println("入出力エラーです。"); }finally{ if(pw != null){ pw.close(); } } } }

    • ベストアンサー
    • Java
  • Javaの文字コード変換方法

    文字コードの変換で困っています。 例えば、標準入力で「あいう」と入力して、その文字列を UTF-8に変換して出力したいのですが、うまくいきません。 サイトにはbyteに変換してから入れると書いていましたが、 よくわかりませんでした。 宜しくお願いします。 以下、今できているソースです。 (ソースコード) import java.io.*; public class ChangeCord { public static void main( String[] args ) { try { System.out.println("何か日本語を入力してください。"); BufferedReader br = new BufferedReader( new InputStreamReader(System.in, "UTF-8")); String str = br.readLine(); System.out.println("文字コードUTF-8に変換した結果"); System.out.println(str); }catch (Exception e) { System.out.println("エラー"); } } } (出力結果) 何か日本語を入力してください。 あいう 文字コードUTF-8に変換した結果 ?????? 以上です。

    • ベストアンサー
    • Java
  • 文字化けします。

    お世話になります。 ソケットでサーバとクライアントを接続しています。 コーディングの概略は次の通りです。 【クライアント】 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"EUC_JP")); out.println("かきくけこ"); System.out.println(in.readLine()); 【サーバ】 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"Shift_JIS")); String inputLine; while ((inputLine = in.readLine()) != null) { System.out.println(inputLine); out.println(inputLine); //←これはクライアントでも文字化けしない。 String s1 = "あいうえお"; String u1 = new String(s1.getBytes("xxxxx"), "yyyyy"); out.println(u1); //←文字化けする。 } お伺いしたいのは文字コード変換についてです。 サーバ:RedhatLinux クライアント:Windowsでして、 サーバ側コーディングの String s1 = "あいうえお"; としている文字列を クライアント側の // 読み込んだデータを表示 System.out.println(in.readLine()); で表示したいのですが、文字が化けて(????←このようになります)困っています。 文字コード変換しなければいけないと思うのですが、 getBytesを使うのでしょうか? もしgetBytesを使うならどのように書けばいいのかがわかりません。 分かりにくい説明で申し訳ありませんが、 ご教授ください。宜しくお願いします。

    • ベストアンサー
    • Java
  • UNICODEへの文字コード変換

    以下のようにして、 日本語で書かれたファイルを読み込んで、 UNICODEに変換したいのですが、 できません。。。 どこが間違っているのでしょうか?(;;) 元の日本語ファイル「こんにちは」 >>できたファイル「\u3053\u3093\u306b\u3061\u306f」 という風にしたいのですが。。 //FileIOSteramの作成 FileInputStream fis = new FileInputStream(iFile); FileOutputStream fos = new FileOutputStream(oFile); //Stream ラップ InputStreamReader in = new InputStreamReader(fis, "EUC-JP-LINUX"); OutputStreamWriter out = new OutputStreamWriter(fos, "UTF16"); System.out.println(System.getProperty("file.encoding")); //読み込みと書き込み int c; InputStreamReader in = new InputStreamReader(fis, "Unicode"); Writer out = new Writer(fos); while((c = in.read()) != -1){ out.write(c); }

  • 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
  • 文字コードを変換する

    //このプログラムは、指定されたURLのソースを読むプログラムです。 import java.io.*; //入出力のAPIを実装するのに用います。 import java.net.*; //ネットワークに関するAPIを実相するのに用います。 import java.lang.*; class rss { public static void main(String args[]) { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); try{ System.out.println("読み込みたいRSSのURIを入力してください。"); String address = br.readLine(); //URLを標準入力から読み込みます。 URL url = new URL(address); InputStream uin = url.openStream(); BufferedReader in = new BufferedReader(new InputStreamReader(uin)); String source; //ソースファイル一行を格納する文字列変数です。 //指定したURLのソースファイル標準出力します。 while((source = in.readLine()) != null ){ System.out.println(source); } } catch(IOException e){ System.out.println("ソースを読みこめませんでした。"); } } } というプログラムを作ったのですが、 一部のソースファイルが文字化けを起こします。 そのソースがどの文字コードでできているか? そして、それをどうやったら変換したらいいかを 教えてほしいのです。 お願いします。

    • ベストアンサー
    • Java
  • オブジェクトのシリアル化について

    serializableを使ってオブジェクトの入出力を2つのファイルで行ないたいのですが、出力の部分が分からなくて困っています。どなたか教えてください。プログラムは下のように書いてみました。 シリアル化のプログラム import java.io.*; public class serialin implements Serializable { public static void main(String[] args) throws Exception { //シリアル化して書き出す FileOutputStream fs = new FileOutputStream("output"); ObjectOutputStream os = new ObjectOutputStream(fs); os.writeObject("Hello"); os.close(); } } ------------------------------------------------- 復元のプログラム import java.io.*; public class serialout { public static void main(String[] args) throws Exception { //シリアル化ストリームを読み込んでオブジェクトを復元 FileInputStream fs = new FileInputStream("output"); ObjectInputStream os = new ObjectInputStream(fs); } }

    • ベストアンサー
    • Java
  • 文字化けをなおしたいです。

    下記のようなプログラムで、文字をテキストに出力しているのですが、文字化けしてしまう文字があります。 どのように対処すればよろしいのか教えていただけないでしょうか。(ソース中の(文字化けのする文字)には、例えば、はしごたかの高などです。) OSはhp-uxです。 ======== class test { public static void main(String args[]) { try { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("out.txt",true), "Shift_JIS")); String msg=""; msg="(文字化けのする文字)"; bw.write(msg); bw.flush(); bw.close(); } catch (IOException e) { System.err.println(e); } } }

    • ベストアンサー
    • Java
  • String <=> byte配列 の際のエンコード

    なんで、 String str = "あいうえお"; byte[] temp = str.getBytes("8859_1"); String str2 = new String(temp, "8859_1"); System.out.println(str2); このコードが ????? を出力するかわかる方、おしえてください。

    • ベストアンサー
    • Java

専門家に質問してみよう