- 締切済み
特定の携帯による文字化け
[現象] 携帯電話からJSPで画面(A)を表示をさせ、その画面で入力した文字をサーバ側に返します。 サーバで受け取った文字を利用した画面(B)を携帯で表示させると文字が化けてしまいます。 半角英数字などは正常に表示されるのですが、全角表記の文字は「?」で表示されます。 文字化けしてしまうキャリアはauのみで、docomo、vodafoneは正常に表示できます。 ちなみにIEでも正常に表示できました。 [動作環境] Apache 1.3.26 Tocmat 4.06 java 1.4.1.02 Win2000Sever SP4 サーブレットでは以下のようにShiftJISからUnicodeに変換するメソッドをかましています。 private static String convertString(String s) { if(s == null) { return null; } try { return new String(s.getBytes("8859_1"), "JISAutoDetect"); } catch (UnsupportedEncodingException e) { return s; } } JSP側でも以下のようにShiftJIS対応をしているはずなのですが・・ <%@page contentType="text/html; charset=Shift_JIS"%> <HTML> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=SHIFT_JIS"> <TITLE>XXXXXXX</TITLE> </HEAD> <BODY> はじめに表示させる画面(A)では全角なども正常に表示できているので、ブラウザ→Tomcatの間で 問題が発生しているのではないかと思うのですが、1日潰しましたが解決できません。 auの携帯はW21CAという機種で比較的新しいものです。 どなたかご教授お願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- ngsvx
- ベストアンサー率49% (157/315)
#4です。何度も失礼します。 そのページが本番で動作しているのかどうかわからないのですが、好きにしていいようならとりあえず、 request.getParameter()で取得したもののコードを表示してしまったらどうでしょうか? for(int i = 0 ; i < s.length() ; i++){ String ss = Integer.toHexString((int)s.charAt(i)); //ssを出力 } それと、HTTPヘッダーはCONTENT_TYPEがあやしいと思われるので、これの内容も一緒に出力してしまえばどうでしょうか? *興味ある事象ですので、結果がわかったら、是非ご報告ください。
- ngsvx
- ベストアンサー率49% (157/315)
#3です。 処理を分岐するにしても、なぜそうなっているのか原因を調べた方がいいと思います。 その上で分岐するしかなければ仕方ないですが、もしかしたら他に方法が見つかるかもしれません。 単純に考えるとバグも発生するかもしれませんし。 まず、送られてくる文字がどのように送られているのか、 HTTPヘッダーはどうなっているのか、をうまくいく場合と いかない場合の両方を調べてみる必要があると思います。
- ngsvx
- ベストアンサー率49% (157/315)
あまり詳しくはないですが、 request.setCharacterEncoding("Windows-31J"); としてからrequest.getParameter()を呼べばいいのでは? その場合はconvertString()は使ってはいけません。
お礼
ご回答ありがとうございます。 ご指摘の通り変更してみました。 auは正常に表示されましたしたが、その他はキャリアではrequest.getParameter()直後に文字化けしてしまいますね。 やはり、処理を分岐する以外にau,DoCoMo,Vodafoneに対応することは困難ですかね。残念ですけど・・。
- deadlock
- ベストアンサー率67% (59/87)
METAタグの内容なのですが、 CONTENT="text/html;CHARSET=SHIFT_JIS" ↓ content="text/html; charset=Shift_JIS" と直してみてください。 元情報を見つけられなかったのですが 1.「;」の後ろにある空白は必須 2.「charset」は小文字(必須?) 3.文字コード名はShift_JIS(区別はされないはず) サーバからのレスポンスヘッダでContentTypeが指定されているので Metaタグは無視されているはずなのですが、念のために試してみてください。
お礼
ご指摘の通りMETAタグ内容を変更しましたが、やはりサーバ側で変換メソッドをかました直後には 「?」となってしまいました。 ご返信ありがとうございました。
- Bonjin
- ベストアンサー率43% (418/971)
とりあえずEtherealなどでパケットをキャプチャして、携帯から送られてくる文字コードやサーバが実際に返している文字コードを調べてみては?
お礼
Etherealは使用したことがないですが、チャレンジしてます。 補足なのですが、バイトデータに変換するメソッド[convertString]を使用しなかった場合(request.getParameter での取得のみ)にはauの携帯では正常に表示できました。 しかし、その他のキャリアやIEでは完全に文字化けしていました。 au用に処理の分岐をさせないといけないのでしょうか。 とりあえず、Etherealをためさせてもらいます。有難うございました。
お礼
そうですね。 Bonjinさんに教えていただいた「Ethereal」にチャレンジしていますが、 まだ時間がかかりそうです。 なんとか、原因究明できるように頑張ってみます。 ご回答ありがとうございました。