- PR -

EUC-JPでの文字化けについて

1
投稿者投稿内容
sinh
ベテラン
会議室デビュー日: 2003/01/22
投稿数: 87
投稿日時: 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");
を指定しているのですが、
機種依存文字や"〜"などがリクエスト情報に含まれる場合、"?"となってしまうのですが
文字化けする文字の判別方法としてはどのような方法があるのでしょうか?

よろしくお願いします。
ちょま吉
大ベテラン
会議室デビュー日: 2004/08/04
投稿数: 112
投稿日時: 2005-10-13 22:27
文字化けしているのをどうやって確認したのですか?
ファイルに出力してですか?
デバッガで変数の中身を見てですか?

ちなみに、Shift-JIS - Unicode - EUC-JPのコードマッピングの相違で発生するかもしれません。
下記が参考になるかもです。
http://www.ingrid.org/java/i18n/unicode.html
つばさ
ベテラン
会議室デビュー日: 2005/02/05
投稿数: 54
投稿日時: 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で文字化けするコードがあると思いますが、
その辺の情報リソースがあれば、教えていただければと思います。

回答というより、逆に質問になってしまいましたが、以上です。
ゴゴミル
会議室デビュー日: 2004/01/15
投稿数: 7
投稿日時: 2005-10-14 12:32
文字化けするか判断する方法として、標準APIでは、
java.nio.charset.CharsetEncoder#canEncode()を利用し、判断可能だったと思います。
ただ、性能はさほど良くないらしいですけどね。。。

また、文字化けする文字を特定の文字に変換するなどの処理を行うのであれば、独自にjava.nio.charset.Charsetを実装した方が良いのではないでしょうか。

つばさ
ベテラン
会議室デビュー日: 2005/02/05
投稿数: 54
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)