- - PR -
EUC-JPでの文字化けについて
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-10-13 11:14
sinhと申します。
現在開発環境として、 ・Windows XP sp2 ・Java 1.4.2_08 ・Tomcat 4.1.31 を使用しています。 この開発環境で、JSPをEUC-JPで作成し、ファイルの1行目に <%@page pageEncoding="EUC-JP" contentType="text/html; charset=EUC-JP" %> を指定して、リクエストを受け取るサーブレット側では、 request.setCharacterEncoding("EUC-JP"); を指定しているのですが、 機種依存文字や"〜"などがリクエスト情報に含まれる場合、"?"となってしまうのですが 文字化けする文字の判別方法としてはどのような方法があるのでしょうか? よろしくお願いします。 |
|
投稿日時: 2005-10-13 22:27
文字化けしているのをどうやって確認したのですか?
ファイルに出力してですか? デバッガで変数の中身を見てですか? ちなみに、Shift-JIS - Unicode - EUC-JPのコードマッピングの相違で発生するかもしれません。 下記が参考になるかもです。 http://www.ingrid.org/java/i18n/unicode.html |
|
投稿日時: 2005-10-14 07:08
例えば、AxisのTCPMON等をつかえばURLエンコードされた文字列が確認できます。
「−」(Shift_JISの0x817C、EUC-JP:0xA1DD) なのでURLエンコードされて%A1%DDのような文字列がサーバに送られます。 サーブレットでは、request.setCharacterEncoding("EUC-JP")にしていますので EUC-JPでデコードしたUCS-2の文字列を返すと思います。 が、確かに?に文字化けしますね。 request.setCharacterEncodingを使わずに、 byte[] data = request.getParameter("abc").getBytes("ISO-8859-1"); として、 for (int i=0; i<data.length; i++) { System.out.println("#byet=#"+Integer.toHexString(data[i]&0xff)); } のようにすれば、EUC-JPでエンコードされたbyte列が取得できるので 文字化けをするコードについて、自分で0xA1、0xDDだったら"−"という ふうにコーディングすればいいと思います。 ただ、もっとスマートなやりかたもあると思いますので、そのあたりを ご存知のかたがいれば、ぜひ教えてください。 また、javaで"−".getBytes("EUC-JP")が文字化けするとははじめてしり ましたが、ほかにもEUC-JPで文字化けするコードがあると思いますが、 その辺の情報リソースがあれば、教えていただければと思います。 回答というより、逆に質問になってしまいましたが、以上です。 |
|
投稿日時: 2005-10-14 12:32
文字化けするか判断する方法として、標準APIでは、
java.nio.charset.CharsetEncoder#canEncode()を利用し、判断可能だったと思います。 ただ、性能はさほど良くないらしいですけどね。。。 また、文字化けする文字を特定の文字に変換するなどの処理を行うのであれば、独自にjava.nio.charset.Charsetを実装した方が良いのではないでしょうか。 |
|
投稿日時: 2005-10-15 01:28
ちょっと強引ですが、
---------- //request.setCharacterEncoding("EUC-JP"); byte[] data = request.getParameter("abc").getBytes("ISO-8859-1"); StringBuffer buf = new StringBuffer(); for (int i=0; i<data.length; i++) { if (data[i] > 0) { buf.append(new String(new byte[] {data[i]},"EUC-JP")); } else { if (new String(new byte[]{data[i],data[i+1]}, "EUC-JP").getBytes().length == 1) { System.out.println("文字化けします"); //文字化けする文字をここで、独自に変換 if ((data[i]&0xff) == 0xa1 && (data[i+1]&0xc1) { buf.append("〜"); } } else { buf.append(new String(new byte[] {data[i]},"EUC-JP")); } i++; } -------- なかんじでいかがでしょうか? 「〜」(EUC-JP 0xa1c1)をUNICODEに変換する際に MS変換表の0xFF5EでなくJIS変換表の0x301Cに変換しているのが 敗因と思いますが、やはりこれは独自にコード変換して対応するしかないのでしょうか? しかし、sinh様はプラットフォームがWindowsと思いますが 何故、Windows-31Jをエンコードに使わないのでしょうか? 差しさわりなければ、おしえてください。 |
1