- ベストアンサー
Stringオブジェクトの文字コードの変換について
- Stringオブジェクトの文字コードの変換に関して、iso-8859-1での変換後に日本語部分が3Fになる現象が起きています。
- UTF-8への変換を試みてもうまくいかず、内部のコードをUTF-8にすることができません。
- また、ファイルへの出力においても、Shift_JISでの文字コード変換が行われており、Unicodeの内部処理形式で出力されない理由がわかりません。
- みんなの回答 (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(); }
お礼
大変詳しいご説明ですごくよく分かりました。 おかげさまでやりたかった事ができました。 感謝いたします。 お手間のかかる回答本当にありがとうございました。!