- PR -

URLエンコード文字が取得できません。

1
投稿者投稿内容
seijun1953
会議室デビュー日: 2007/03/15
投稿数: 15
お住まい・勤務地: 東京
投稿日時: 2007-03-26 17:16
Seijun1953です。お世話になっております。
次のようなURLエンコード文字列を取得しようとして、
http://localhost:8080/wiki/refer?name=%83%74%83%48%81%5b%83%7d%83%62%83%67
=============================================
public class ReferServlet extends HttpServlet{

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

request.setCharacterEncoding("Windows-31J");
String name = request.getParameter("name");
//name = URLDecoder.decode(name, "Windows-31J");
//name = "フォーマット";
System.out.println("name: " + name);
=============================================
としてみましたが、Eclipseのコンソールで見ると、nameには、name: ?t?H?[?}?b?g
と文字化けするのみです。日本語を正しく表示させる方法はないものでしょうか。ご教示いただければ幸いです。

[ メッセージ編集済み 編集者: seijun1953 編集日時 2007-03-26 17:21 ]
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-03-26 17:36
QueryStringの内容はWindows-31Jで合っているし、
?t?H?[?}?b?gという化け方からして、
ISO-8859-1と解釈されてそうに思います。

リクエストが開始されてからサーブレットに辿り着くまでに、
フィルタ等でgetParameter()を呼んでいないか確認してみて下さい。

パラメータに最初に触った時点でエンコーディングが決まるため、
以降のsetCharacterEncoding()は無視されたような記憶があります。
seijun1953
会議室デビュー日: 2007/03/15
投稿数: 15
お住まい・勤務地: 東京
投稿日時: 2007-03-26 18:08
早速、有り難うございます。
引用:

あしゅさんの書き込み (2007-03-26 17:36) より:
QueryStringの内容はWindows-31Jで合っているし、
?t?H?[?}?b?gという化け方からして、
ISO-8859-1と解釈されてそうに思います。

リクエストが開始されてからサーブレットに辿り着くまでに、
フィルタ等でgetParameter()を呼んでいないか確認してみて下さい。


実はこのプログラム(「基礎からのサーブレット/JSP改訂版」に掲載)、文字コードを指定するフィルターをweb.xmlに組み込んでいました。試しに、下記のようにそこのところをコメントアウトしましたが、やはり、文字化けは変わりませんでした。
==================================================
<!--
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>fw.EncodingFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
-->
ちなみに、フィルターのプログラムは下記です。
package fw;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class EncodingFilter implements Filter {

public void init(FilterConfig filterConfig)
throws ServletException {
//何もしない
}

public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException, ServletException {

request.setCharacterEncoding("Windows-31J");
chain.doFilter(request, response);
}

public void destroy() {
//何もしない
}

}
seijun1953
会議室デビュー日: 2007/03/15
投稿数: 15
お住まい・勤務地: 東京
投稿日時: 2007-03-26 21:03
Seijun1953です。Tomcatをインストールしたディレクトリの/conf/server.xmlの、
<Connector port="8080"辺りの最後に、useBodyEncodingForURI="true"を挿入したら、文字化け問題が解消しました。本によると、Tomcatは5.xから、デフォルトでGETで送られる文字列のデコードには、必ずISO8859-1が使われるようになったとのことでした。121頁。見落としておりまして、大変お騒がせいたしました。
1

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