アプリ版:「スタンプのみでお礼する」機能のリリースについて

オールインワンEclipse3.4
tomcat5.5
上記の環境で、サーブレットの参考書に沿ってサンプルを作成していたのですが、パラメータボックスに日本語を入力すると文字化けしてしまい、ブラウザに日本語で表示することができません。
英文字では問題なく表示できるので、エンコード・デコードのどこかで間違っているのだと思うのですが、参考書に書いてあることを試しましても、うまくいきません。
どなたかご指導お願いいたします。
----------
echo.jsp
----------
<%@page contentType="text/html; charset=Windows-31J"       pageEncoding="Windows-31J"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>

<body>

<h2>EchoServletの入力</h2>

<form action = "/basic2/EchoServlet2">
<input type="text" name="message">
<input type="submit" value="表示" >
</form>
</body>
</html>
---------------------
EchoEchoServlet2.java
---------------------
package input;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class EchoServlet2 extends HttpServlet{
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException{

request.setCharacterEncoding("Windows-31J");
String msg = request.getParameter("message");
System.out.println("msg =" + msg);//確認用

//response.setContentType("text/plain; charset=Windows-31J");

PrintWriter out = response.getWriter();
System.out.println("out = " + out);//確認用
out.println("message=" + msg);
}
}
--------------------------------
tomcatの保存されているserver.xml
--------------------------------
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
<Connector port="8000"
maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true"
useBodyEncodingForURI="true"←ボディのエンコードを使う指定を追加しました
/>


よろしくお願いいたします。

A 回答 (1件)

拙者宅の環境でテストすると、


●ケース1
> useBodyEncodingForURI="true"
を記述した場合、 EchoServlet2クラスにて受け取れるパラメータが既にUnicodeに
エンコーディング済みになってましたよ。
ですから、Unicodeパラメタに
> request.setCharacterEncoding("Windows-31J");
とすると、当然文字化けしました。(UnicodeはWindows-31Jじゃないですからね)

●ケース2
> useBodyEncodingForURI="true"
を指定しない場合には、EchoServlet2クラスにて受け取れるパラメータはWindows-31J
となっています。
ですから、
> request.setCharacterEncoding("Windows-31J");
を使って、正しくエンコーディング出来ました。

確認環境:
Windows2000Pro
JDK1.6.0_04
Tomcat5.5.12
Firefox2.0,0.17

この回答への補足

お返事ありがとうございます!

>> useBodyEncodingForURI="true"
>を指定しない場合には、EchoServlet2クラスにて受け取れるパラメー>タはWindows-31J
>となっています。
>ですから、
>> request.setCharacterEncoding("Windows-31J");
>を使って、正しくエンコーディング出来ました。

ということは、useBodyEncodingForURI="true"
の一文を削除すれば、環境の違いこそあれ、表示されるかもしれないということでしょうか?

最初それが記述していない状態でできなくて、その後で記述したのですが、ひょっとしてやらないほうが良かったんでしょうか?

補足日時:2008/11/11 00:56
    • good
    • 0
この回答へのお礼

ありがとうございます!

いただいたアドバイスをもとに、
試行錯誤を繰り返した結果、文字化け解消しました!

おっしゃっていた、 useBodyEncodingForURI="true"
を消して、コンテントタイプの指定とエンコーディングのおいてあった場所をちょこっと変えただけで出来ました!!

ご指導ありがとうございました。

お礼日時:2008/11/12 10:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!