- PR -

Servletの文字化け

投稿者投稿内容
Hide
会議室デビュー日: 2003/02/25
投稿数: 11
投稿日時: 2003-02-25 19:09
下記のような運用で日本語の文字化けに悩まされています。
環境:
RedHat 7.2
tomcat4-4.1.12-full.2jpp
apache-1.3.27-1.7.2

下記のコーディングでブラウンザーから
http://fsgt010.soft.hitachi.co.jp/dic/servlet/TestGet?MY2=aあa
を実行すると、Netscapeでは正しい結果が得られますが、
query=MY2=a%82%A0a
MY2=aあa
IEは下記のように文字化けになってしまいました。
query=MY2=a??a
MY2=a??a

Apacheのaccess_logを見ると、Netscapeから渡されたパラメータは"a%82%A0a"に対して、IEの方のパラメータは"a\x82\xa0a"になっています。
[25/Feb/2003:18:58:54 +0900] "GET /dic/servlet/TestGet?MY2=a%82%A0a HTTP/1.1"
[25/Feb/2003:18:59:19 +0900] "GET /dic/servlet/TestGet?MY2=a\x82\xa0a HTTP/1.1"

そして、IEで下記のようなURLで指定すると文字化けしなく表示できます。
http://fsgt010.soft.hitachi.co.jp/dic/servlet/TestGet?MY2=a%82%A0a

よく理解できませんが、設定の悪い?コーディングの悪い?或いはApacheやブラウンザーの仕様?
誰か頭いい方、教えてください。

=コード=
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class TestGet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
response.setContentType("text/html;charset=EUC_JP");
PrintWriter out = new PrintWriter((new OutputStreamWriter(response.getOutputStream(),"EUC_JP")),true);
// PrintWriter out = response.getWriter();
String query = request.getQueryString();
String MY2 = new String(request.getParameterValues("MY2")[0].getBytes("8859_1"),"SJIS");
// String MY2 = new String(request.getParameterValues("MY2")[0].getBytes("MS932"),"SJIS");
out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>JP1 Dictionary</TITLE>");
out.println("<BODY>");
out.println("query=" + query + "<BR>");
out.println("MY2=" + MY2);
out.println("</BODY>");
out.println("</HTML>");
}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
doGet(request, response);
}
}

m.hosoi
会議室デビュー日: 2002/10/10
投稿数: 13
お住まい・勤務地: 東京
投稿日時: 2003-03-05 13:15
少なくとも、
responseがEUC
requestがSJIS
というところが不自然です。
Hide
会議室デビュー日: 2003/02/25
投稿数: 11
投稿日時: 2003-03-14 11:34
responseがEUC
requestがEUC
及び
responseがSJIS
requestがSJIS
共試しましたが、結果は同じです。

Apacheのaccess_logに表示しているNSとIEのパラメータの違い(NS−"a%82%A0a"IE−"a\x82\xa0a")と関係ありますかね?
[25/Feb/2003:18:58:54 +0900] "GET /dic/servlet/TestGet?MY2=a%82%A0a HTTP/1.1"
[25/Feb/2003:18:59:19 +0900] "GET /dic/servlet/TestGet?MY2=a\x82\xa0a HTTP/1.1"

また、ApacheはTomcat4にmod_webapp-1.0-1を利用して、連携する場合だけ上記の現象が発生します。
因みに、
http://xxx.xxx.xxx/dic/servlet/TestGet?MY2=aあa
の時だけ発生します。
http://xxx.xxx.xxx:8080/dic/servlet/TestGet?MY2=aあa
の時はNSもIEも正常に表示できます。

raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2003-03-14 12:35
引用:

http://xxx.xxx.xxx/dic/servlet/TestGet?MY2=aあa
の時だけ発生します。
http://xxx.xxx.xxx:8080/dic/servlet/TestGet?MY2=aあa
の時はNSもIEも正常に表示できます。



こんにちは
両ブラウザとも
http://xxx.xxx.xxx/dic/servlet/TestGet?MY2=a%82%A0aで
リクエストすると正常に表示されますか?

FORMパラメータはエンコードして送信したほうがよろしいと思います。
asip
ベテラン
会議室デビュー日: 2001/12/27
投稿数: 77
投稿日時: 2003-03-14 18:07
コード:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class TestGet extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response) 
  throws IOException, ServletException
  {
    response.setContentType("text/html;charset=EUC_JP");
    PrintWriter out = response.getWriter();
    String MY2 = new   
    String(request.getParameterValues("MY2")[0].getBytes("8859_1"),"EUC_JP");
    out.println("<html>");
    out.println("<head>");
    out.println(<meta http-equiv="Content-Type" content="text/html;    
    charset=EUC_JP">);
    out.println("<title>JP1 Dictionary</title>");
    out.println("</head>");
    out.println("<body>");
    out.println("MY2=" + MY2);
    out.println("</body>");
    out.println("</html>");
  }
  public void doPost(HttpServletRequest request, HttpServletResponse response)       
  throws IOException, ServletException
  {
    doGet(request, response);
  }
} 

asip
ベテラン
会議室デビュー日: 2001/12/27
投稿数: 77
投稿日時: 2003-03-14 18:12
コード:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class TestGet extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response) 
  throws IOException, ServletException
  {
    response.setContentType("text/html;charset=MS932");
    PrintWriter out = response.getWriter();
    String MY2 = new   
    String(request.getParameterValues("MY2")[0].getBytes("8859_1"),"MS932");
    out.println("<html>");
    out.println("<head>");
    out.println(<meta http-equiv="Content-Type" content="text/html;    
    charset=MS932">);
    out.println("<title>JP1 Dictionary</title>");
    out.println("</head>");
    out.println("<body>");
    out.println("MY2=" + MY2);
    out.println("</body>");
    out.println("</html>");
  }
  public void doPost(HttpServletRequest request, HttpServletResponse response)       
  throws IOException, ServletException
  {
    doGet(request, response);
  }
}

asip
ベテラン
会議室デビュー日: 2001/12/27
投稿数: 77
投稿日時: 2003-03-14 18:23
JDK1.4以前ではMS932のエンコーディング名としてのサポートが明示されていますが、
JDK1.4.1以降ではMS932のエンコーディング名としてのサポートは明示されていません
(サポートされているかも未確認)ので、JDK1.4.1ではWindows-31Jの使用を推奨します。
Hide
会議室デビュー日: 2003/02/25
投稿数: 11
投稿日時: 2003-03-25 15:03
raystarへの返事:
http://xxx.xxx.xxx/dic/servlet/TestGet?MY2=a%82%A0aでリクエストすると両ブラウザとも正常に表示されます。
(NSのほうはaあaで渡すと自動的にa%82%A0aと変換してくれます)
但し、パラメータは他のURLからaあaの形で受け取りますので、エンコードできない状態です。
======================================

asipへの返事:
MS932のエンコーディングも試しましたが、やはりIEの方はMY2=a??aになります。

======================================
纏めると
http://xxx.xxx.xxx/dic/servlet/TestGet?MY2=aあa
EUC=>NS:OK IE:NG
SJIS=>NS:OK IE:NG
MS932=>NS:OK IE:NG

http://xxx.xxx.xxx:8080/dic/servlet/TestGet?MY2=aあa
EUC=>NS:OK IE:OK
SJIS=>NS:OK IE:OK
MS932=>NS:OK IE:OK

Apache+Tomcat4の連携でIEと相性わるいでしょうか?

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