- ベストアンサー
JSP&Servletについて
いつもお世話になっております。 JSP&Servletについての質問です。 ある画面からパラメーターを入力してServletに渡し、 その計算結果をResult.jspの画面に返すというツールを作成しているのですが、なぜか漢字が含まれていると文字化けしてしまいます。 ServletのほうでsetContentTypeメソッドを使っていないからでしょうか? でもResult.jspのほうで以下のようにしているのでいけると思うのですが、、 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <META http-equiv="Content-Style-Type" content="text/css"> <TITLE>Result</TITLE> </HEAD> <BODY> <H1>Result</H1> <% String result = (String)request.getAttribute("result"); if (result != null){ %> <%= result %> <% } %> </BODY> </HTML> たとえば結果として 2002年と返したい場合 2002?と返ってきてしまいます。 お願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
すみません、さっきのでは、エラーが出るかもしれません。最初に以下のメソッドを宣言してください。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <%! public String strEncode(String strVal) throws UnsupportedException { if(strVal == null) { return (null); } else { return (new String(strVal.getBytes("ISO-8859-1"),"JISAutoDerect")); } } %> それで、 <% String result = strEncode((String)request.getAttribute("result")); %> <%= result %> で、うまく出力されると思います。 ちなみに、#3と#4の JISAutoDirect って書いてあるんですが、JISAutoDerectです。 DerectをDirectと書いてしまいました。 では、がんばってください。
その他の回答 (5)
- sasadora
- ベストアンサー率68% (59/86)
JISAutoDerectも間違ってますよ。(^^; JISAutoDetectが正解。 サポートされているエンコーディングについては、 http://java.sun.com/j2se/1.4/ja/docs/ja/guide/intl/encoding.doc.html を参照してください。 ●なぜ、こんな文字化けが発生するのか? HTTPのリクエストを送信する際には、 ブラウザ→Webサーバ→Servletという形で送られます。 JavaにおけるStringはUnicodeで持っています。 ところが、ブラウザから送信する文字列は、Unicodeとは限りません。 さまざまな文字コードのデータが送信されます。 それなのに、送信する文字列がどんな文字コードを使っているかの情報は 送信されません。(受信する際にはあります) したがってServletEngineは、なんの文字コードか分からないデータを判別して、 Unicodeにしてあげないといけないのです。 WebSphereなどはこれを判別してUnicodeにしてくれますが、 Tomcatは、「送られてきたデータは、ISO-8859-1だな。」と決め付けて Unicodeにします。その結果ISO-8859-1と食い違う部分が文字化けします。 (半角英数字などはISO-8859-1と一致するので文字化けしません) なので対応策として、 ・TomcatがISO-8859-1だなと決め付けてUnicodeにしたデータを、 一旦元のバイトデータに戻します。 byte[] temp = request.getParameter("result").getBytes("8859_1") ・送られてきた文字コードにあわせて、新たにStringを生成します。 new String(temp, "JISAutoDetect") このときに元の文字コードが何であるか正確に判断する方法はありません。 (送られてこないので) JISAutoDetectはデータから自動的に判別してくれるものですが、 データが少なすぎると、判別不能で間違う可能性もあります。 ただ、一般的なブラウザでは送るデータの文字コードは、 表示した画面の文字コードに合わせられます。 シフトJISで表示した画面からはシフトJISで送られてくるので、 それを信じて、JISAutoDetectを使わずに、SJISやMS932 を使うというのも安全です。
- kamkamkam3
- ベストアンサー率42% (216/514)
<% String result = (String)request.getAttribute("result"); String result2 = new String(result.getBytes("ISO-8859-1"),"JISAutoDirect"); if (result != null){ %> <%= result2 %> <% } %> で良いと思います。
- kamkamkam3
- ベストアンサー率42% (216/514)
もう1個Stringオブジェクトを宣言し、それで、encodeを変えてみては? String result2 = new String(result.getBytes("ISO-8859-1"),"JISAutoDirect")); んでもって、 <%= result2 %> ってすれば、たぶんできます。 できない時は、JISAutoDirectの部分を Shift_JIS に変えてください。Linuxの時は、EUC-JP 似変えてください。原因はJavaがUNICODE使用なのに対し、JSPコンテナ(TOMCAT等)が、何の加工もせずに、処理を開始してしまうためです。 要するに、Stringのコンストラクタの文字コードを変換してくれるやつを、使ってます。 JSPはあまり、知らんので、コードは打てませんが、多分この方法でできます。では、がんばってください。
- o84
- ベストアンサー率31% (128/407)
補足です。 これを参考に、先程の資料を読んでみてください。 俺はLINUXじゃねーーと思っても、文字のエンコードの問題は共通ですので。 #私もLINUXではありません。文字化けの問題と戦ったのはたしかTOMCATでした。 String str = request.getParameter( "hogehoge" ); //ここでout.Printlnすると???のように化けて見える If( str != null ) { // 一旦ByteCodeに戻してまたUnicodeにする str = new String( new.getBytes( "8859_1" ), "Shift_JIS" ); }
- o84
- ベストアンサー率31% (128/407)
ブラウザからサーブレットに日本語を渡すと文字化けした経験は私もあります。 サーバーは何をお使いですか? WebSphereなら内部で自動的にエンコードしてくれますが、他のサーバーはそこまで親切ではありませんので、自分でどういうエンコードをするのか指定してやらないと何もしてくれません。 まずこのサイト(↓)を読んでみましょう。 私の場合はこれを読んで解決しました。 簡単に答えを言うと、ブラウザからUNICODEで来たのを一旦バイトコードに戻して、またUNICODEにします。変な気もしますが、そうしなければいけないようです。