- PR -

サーブレット→JSPでの文字コード

1
投稿者投稿内容
ma
常連さん
会議室デビュー日: 2004/08/09
投稿数: 34
お住まい・勤務地: 福岡
投稿日時: 2005-06-23 14:38
JSPからdoGetでサーブレットに入力データ(文字列)を送り、
入力データをそのまま同じJSPに送り返して表示しよう
としています。
文字コードはすべてEUC-JPなのですがJSPで返ってきた文字列を
表示すると文字化けが起こっています。
サーブレットからJSPに文字列を表示するために何か処理を
しなければならないのでしょうか?

以下はJSPの記述です。
<%@page contentType="text/html;charset=EUC-JP" %>
<%@page import="java.util.*" %>
<html>
<body bgcolor="#FFFFFF">
<%
String keyword = (String)request.getAttribute("Keyword");
if(keyword != null){
%>
エンコーディング:<%=request.getCharacterEncoding() %><br />
<a href="test_env?Keyword=おーけー"><%=keyword %></a>
<%
}else{
%>
<a href="test_env?Keyword=えぬじー">キーワード</a>
<%
}

%>
</body>
</html>


以下はサーブレット側の記述です。
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class test_env extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException{
this.processRequest(req,res);
}

public void processRequest(HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException{

req.setCharacterEncoding("EUC-JP");
res.setContentType("text/html; charset=EUC-JP");

String keyword = req.getParameter("Keyword");

//文字列をセットしてJSP側に処理を返す
req.setAttribute("Keyword",keyword);
RequestDispatcher rd = req.getRequestDispatcher("/test_env.jsp");
rd.forward(req,res);
}
}


ためしに、JSPから送られてきた文字列をサーブレットで表示すると
文字化けが起きずに表示できました。(文字コードはEUC-JP)



上記の文を訂正します。
この投稿の後にもう一度検証してみるとサーブレットで表示した文字列も
化けていました。



[ メッセージ編集済み 編集者: ma 編集日時 2005-06-23 16:36 ]
itkmh
会議室デビュー日: 2005/04/06
投稿数: 7
お住まい・勤務地: 東京都
投稿日時: 2005-06-23 14:52
JSPファイルはどの文字コードで書かれたものなのでしょうか?
pageEncoding="JSPファイルの文字コード"などを追加するとどうなりますか?

質問をする場合
・開発環境
・運用環境
・バージョン
を記述したほうが解答を得られやすくなると思います。
ma
常連さん
会議室デビュー日: 2004/08/09
投稿数: 34
お住まい・勤務地: 福岡
投稿日時: 2005-06-23 15:14
itkmhさん、返答ありがとうございます
JSP、サーブレットともにEUC-JPで記入しています。

pageEncoding="EUC-JP"としてみたのですがだめでした。
JSP内にある文字は化けていないのですが
サーブレットから返ってきた文字列が化けています。

環境は
OS: SUSE Linux 9.2
WEB: Apache Tomcat 5.0.28

です。

[ メッセージ編集済み 編集者: ma 編集日時 2005-06-23 15:25 ]
mone
常連さん
会議室デビュー日: 2005/05/18
投稿数: 37
投稿日時: 2005-06-23 15:50
こんにちは、moneです。

入力データというのはHTML等のフォームから送信するんですよね?

確か、フォームに記述された内容はISO8859-1で送られた気が。。。
記憶違いだったらすいません。

#masaさんの紹介したページのような解決方法もあったんですね。
#new String(text.getBytes("8859_1"),"EUC-JP");
#のような方法で解決していました。。。

[ メッセージ編集済み 編集者: mone 編集日時 2005-06-23 16:01 ]
masa
大ベテラン
会議室デビュー日: 2005/05/11
投稿数: 108
投稿日時: 2005-06-23 15:52
こんにちは。

http://www.atmarkit.co.jp/fjava/rensai3/mojibake03/mojibake03.html
■GETメソッド利用時の注意点

の現象ではないでしょうか?
ma
常連さん
会議室デビュー日: 2004/08/09
投稿数: 34
お住まい・勤務地: 福岡
投稿日時: 2005-06-23 16:27
返答ありがとうございます。
おかげで問題が解決できました。

→moneさん
引用:
入力データというのはHTML等のフォームから送信するんですよね?
確か、フォームに記述された内容はISO8859-1で送られた気が。。。
記憶違いだったらすいません。



アンカータグでサーブレットに飛ばしています。
なので文字列はクエリとして送っています。
フォームでの送信はdoPostで行っていたので、
doGetで文字化けの現象がおきた時は理解不能状態になってました

→masaさん
指定URLより
引用:
一方、Tomcat 5.0.28では、これとまったく同じJSPページで、
パラメータの文字化けが発生してしまう。
Tomcat 5.xではGETにより受信したパラメータに対して、
setCharacterEncodingメソッドの文字コードを「適用しない」
という仕様変更がなされているのである。



まさにこの通りでした。
文中に「5.0.28」とあったときは「!」でした。
エンコーディングされない理由は理解できましたが、こんな仕様
になっていたとは・・・!
useBodyEncodingForURI="true"とすると見事に文字列がエンコ
ーディングされました。

useBodyEncodingForURI属性を変更して他に影響がでないのか気に
なるところですが、ひとまずは安心できました



[ メッセージ編集済み 編集者: ma 編集日時 2005-06-23 16:31 ]
1

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