- 締切済み
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でも構いませんが教えてください。 以上、よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- run34ricky
- ベストアンサー率64% (38/59)
>(丸数字全てが0x3fになっていました。期待していたコード、というか本来は、0xADA1~0xADB4のはずです。) 文字化けしているのは丸数字だけですか? ならば、「EUCに変換していること」そのこと自体が文字化けの原因です。 これは、Javaの問題ではなく文字コード変換のする際のマッピングの問題です。 EUCには丸数字がないため、変換できず、仕方がなく未定義を表す文字コードに変換されます。その「未定義を表す文字コード」をnew Stringで復元しているため、結果として得られる文字列は未定義文字=文字化けになります。 できない以上、過去で同様に事例に当たった際には、以下のいずれかの方針で対応しました。 1.丸数字をサポートしない。 2.EUC-JPを使用せず、UTF8、MS932を使用する。
お礼
お礼が遅くなりました。やはり、それしかないのですね。ありがとうございました。