• 締切済み

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でも構いませんが教えてください。 以上、よろしくお願いします。

  • Vargas
  • お礼率85% (174/204)
  • Java
  • 回答数1
  • ありがとう数4

みんなの回答

回答No.1

>(丸数字全てが0x3fになっていました。期待していたコード、というか本来は、0xADA1~0xADB4のはずです。) 文字化けしているのは丸数字だけですか? ならば、「EUCに変換していること」そのこと自体が文字化けの原因です。 これは、Javaの問題ではなく文字コード変換のする際のマッピングの問題です。 EUCには丸数字がないため、変換できず、仕方がなく未定義を表す文字コードに変換されます。その「未定義を表す文字コード」をnew Stringで復元しているため、結果として得られる文字列は未定義文字=文字化けになります。 できない以上、過去で同様に事例に当たった際には、以下のいずれかの方針で対応しました。 1.丸数字をサポートしない。 2.EUC-JPを使用せず、UTF8、MS932を使用する。

Vargas
質問者

お礼

お礼が遅くなりました。やはり、それしかないのですね。ありがとうございました。

関連するQ&A

  • Javaでの文字化けの検出

    Javaでの文字化けの検出 byte配列をStringのコンストラクタの引数に指定してStringに変換した場合に 指定した文字コードで変換できなかった時、System.out.printlnでは"?"で表示されますが、 そのような状態を検出したいのですが、方法がわかりません。教えてください。 "?".equals(対象文字)をしてみてもイコールにならないようです... 文字コードはMS932 UTF-8 Unicodeでの使用になります。OSは日本語WindowsXPです。

  • javaでEUC-JP文字列→UTF-8への変換

    DB内にEUC-JPで保存されているデータを取得して、これをUTF-8文字列として扱いたいです。 phpでいうところの$string = mb_convert_encoding($string, "UTF-8", "EUC-JP"); をjavaで実現したいです。 どのように記述すれば変換できるのでしょうか? 検索しても、数十行もコードを書いて実現しているものばかりで、 シンプルな方法が見つかりません。 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の配列になるのかということです。 ひどい乱文ですみませんが、よろしくお願いします。

  • 0バイト文字の送信

    C#ですが、C/C++でも同じだと思うので、 お願いします。 たとえば、"abcde"という文字を、終端文字0バイト として、送信したいのですが、どうしたらいいので しょうか。 string mys="abcde"; byte[] mybyte=new byte[1024]; mybyte=Encoding.UNICODE.GetBytes(mys); mynetwork.Write(mybyte,0,mybyte.Length); こんな感じで、書き出すつもりですが、終端が、 0バイトには、なっていないようです。 (ちなみに、JAVAだと、文字列を、送るので "abcde\0"で、うまくいきます。バイト配列で 送る場合が、わかりません。 分かる人がいましたら、お願いします

  • EUC-JP-LINUXの文字化け

    文字化けで困っているのですが,通常有名なエンコードをしても直りませんでした。 それで String enc = System.getProperty("file.encoding"); で表示させたら EUC-JP-LINUX とでましたが、この時の strPar = new String(strPar.getBytes("ISO-8859-1"),"Shift_JIS"); はどうしたらよいのでしょうか? ちなみに画面は contentType = "text/html;charset=Windows-31J" としています。

  • 環境に依存しない文字長(日本語含む)の取得方法

    Stringデータ(日本語含む)の文字長を取得したいと考えています。 但し、日本語は2byte文字としてカウントしなくてはいけません。 で、今まで、 String.getBytes().length; で取得していたのですが、何かのタイミングで日本語を2byteとして扱えず、 「あいうA」を4byteと算出してしまうことがありました。 それで、getBytes()の引数にgetBytes("SJIS")と明示して取得することで、環境に依存しないbyte配列変換ができるのかなぁ、、と思っていますが、 この対応は間違っていないのでしょうか? また、これ以外の日本語byte数のカウント方法で「環境に依存しない」はあるのでしょうか? ご教授願います。

  • 「C#」文字コードの取得&文字変換

    C#で文字コードを調べるプログラムを作成しています。 そこで2つ質問をさせてください。 1つ目(文字コード調べ) TextBoxに漢字を入力して,各エンコーディングの文字コードを調べるときに,UNICDEの場合, Encoding enc_default = Encoding.GetEncoding(932); string input = tb_input.Text; byte[] byte_input = enc_default.GetBytes(input); string outtext_unicode = ""; Encoding enc_unicode = Encoding.Unicode; byte[] byte_unicode = Encoding.Convert(enc_default,enc_unicode, byte_input); foreach (byte b in byte_unicode) { outtext_unicode += string.Format("{0:X}", (int)b); } tb_output_unicode.Text = outtext_unicode; とすると,調べたい文字コードがLE(リトルエディアン)で出力されます。これをBE(ビッグエディアン)で出力されるにはどうしたらよいでしょうか? ご存知の方がいらっしゃいましたら,ぜひ教えてください。 よろしくお願いいたします。 2つ目(文字コードから文字を取得する) 上記の質問と逆のパターンで,TextBoxに文字コードを入力してもらい,人間が読める文字に変換する場合下記のようなコードを書くと, string codePoint_string = tb_output_unicode.Text; int codePoint = int.Parse(codePoint_string); char c = (char)codePoint; tb_input.Text = Convert.ToString(c); ASCIIの文字コードを入力した場合には,きちんと変換してくれるのですが,漢字の文字コードを入力すると,FormatExceptionが発生します。 何か勘違いをしているのかもしれませんが,いまいちやり方が創造できません。 こちらも,ご存知の方がいらっしゃいましたら,ご教示願います。

  • [再質問]VC#で2進数の文字列をバイト列に変換する方法

    No.1029439で質問して回答頂きましたが、もう一度お願いします。 string strに2進数の文字列がNバイト分入っているとします(0か1が8×N個入っている)。これを1バイト分ずつbyte型の配列に入れたいです。 例えば、str = "1010111100101100"と2バイト分入ってるときは、byte型の配列bytesに bytes[0] =0xAF(10101111) bytes[1] =0x2C(00101100) となるようにしたいです。 最終的には↓のようにして、文字を出力したいためです。 Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS"); string str = sjisEnc.GetString(bytes); http://www.atmarkit.co.jp/fdotnet/dotnettips/011byte2str/byte2str.html よろしくお願いします。

  • 文字化けします

    またまた質問で申し訳ないんですが、よろしくお願いします。 Servletで表示させる文字が化けます。 ServletのdoGet()を呼び出しています。 ServletをURLにて直接呼び出しているので、doGetで間違いないと思います。記述としては、 response.setContentType(text/html;charset=Shift_JIS); と記述しています。 過去の質問等も調べて、byteに変換してJISAutoDetectを指定しても直りませんでした。 str = new String(str.getBytes("iso-8859-1"), "JISAutoDetect")としました。 8859-1も、同様に駄目でした。 そして、tomcatを起動した時に出るDos窓に 「Unsuported encoding: Shift_JIS」 と出ているのですが、tomcat3-1-4ではサポートされてないのでしょうか?? なんとか、解決策ってないでしょうか? 教えてください。よろしくお願いします。

  • UTF-8とUTF-16について質問です。

    まず、【あ】という文字をUTF-16というエンコーディング方式で バイト配列化すると [0] => 66 [1] => 48 というバイト値が帰ってきます。 これはとりあえずC#で処理を行いました。 Encoding encode = Encoding.GetEncoding("UTF-16"); String value = "あ"; Byte [] byteData = encode.GetBytes(value); それでは【あ】という文字の文字集合のコードポイントは右記となります。【0x3042】 これは、出力された 66、48という数値を16進数に変換すると 66=>42 48=>30 となり、リトルエンディアン環境で 0x4230という16進数であらわされるようです。 この点も不思議なのですが今回知りたいのはUTF-16でエンコーディングされた バイト配列はこのように文字集合のコードポイントに復帰?させることができますよね? ではUTF-8でエンコーディングされた【あ】という文字の バイト配列 [0] => 227 [1] => 129 [2] => 130 というバイト配列を上記のような文字集合のコードポイントの値へ復帰させることは できるのでしょうか? それに伴いUTF-8でつかわれる文字集合もUTF-16と同じコードポイントなのでしょうか? 上記 1.UTF-8でエンコーディングされた文字列をバイト配列にした場合 元の文字集合に戻せるのか?戻せるならばその戻し方は? 2.UTF-8がさす文字集合とUTF-16がさす文字集合はおなじものですよね? 上記二点よろしくご教授ください。

専門家に質問してみよう