• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Stringオブジェクトの文字コードの変換)

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

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

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

  • ベストアンサー
  • 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

専門家に質問してみよう