- かしん
- 常連さん
- 会議室デビュー日: 2004/08/27
- 投稿数: 25
- お住まい・勤務地: 窓際
|
投稿日時: 2006-08-07 22:32
お知恵をお貸しください。
OS: windows xp
Tomcat5.5 + JSF 1.1環境において、JSF用のJSPページのページエンコーディングがUTF-8で出力されることを確認しています。
同JSPファイルを、Tomcat4.1 + JSF1.1環境で動作させると、ページエンコーディングがShift_JISになってしまいます。
Tomcat4.1 + JSF1.1環境でも、単純なJSPページがUTF-8で出力されることから、JSTLが怪しい?などと考えていますが、どうにもわかりません。
以下に、JSPファイルのコードを示します。
JSFのJSPファイル
コード: |
|
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<f:view>
:
:
:
|
単純なJSP
コード: |
|
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
ほげほげ
</body>
</html>
|
原因・解決方法をご教授いただきたく。
|
- かしん
- 常連さん
- 会議室デビュー日: 2004/08/27
- 投稿数: 25
- お住まい・勤務地: 窓際
|
投稿日時: 2006-08-10 14:45
お世話になっております。
自己レスです。
コード: |
| <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<% System.out.println(response.getCharacterEncoding());%><%-- @ --%>
<f:view>
<% System.out.println(response.getCharacterEncoding());%><%-- A --%>
<%response.setContentType("text/html; charset=UTF-8"); %><%-- B --%>
:
:
|
上記の、@、Aの行を入れてみたところ、4.1環境で、結果は以下のようになりました。
UTF-8
Shift_JIS
5.5環境では、
UTF-8
UTF-8
でした。
f:viewタグを前後に、レスポンスのエンコーディングが変わってしまっていました。
jspのjavaファイルも見てみました。(4.1環境)
コード: |
|
System.out.println(response.getCharacterEncoding()); // @
out.write("\r\n");
/* ---- f:view ---- */
com.sun.faces.taglib.jsf_core.ViewTag _jspx_th_f_view_0 = (com.sun.faces.taglib.jsf_core.ViewTag) _jspx_tagPool_f_view.get(com.sun.faces.taglib.jsf_core.ViewTag.class);
_jspx_th_f_view_0.setPageContext(pageContext);
_jspx_th_f_view_0.setParent(null);
int _jspx_eval_f_view_0 = _jspx_th_f_view_0.doStartTag();
if (_jspx_eval_f_view_0 != javax.servlet.jsp.tagext.Tag.SKIP_BODY) {
if (_jspx_eval_f_view_0 != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE) {
javax.servlet.jsp.tagext.BodyContent _bc = pageContext.pushBody();
out = _bc;
_jspx_th_f_view_0.setBodyContent(_bc);
_jspx_th_f_view_0.doInitBody();
}
do {
out.write("\n");
System.out.println(response.getCharacterEncoding()); // A
out.write("\n");
response.setContentType("text/html; charset=UTF-8"); // B
|
どうやら、pageContext.pushBody();が実施されて、新しくBodyContentが作成された時に、文字コードが引き継がれないようにみえます。
とりあえず、Bの行を追加したところ、UTF-8で出力されるようになりました。
もうちょっと調べてみます。
以上、ご報告でした。
#エンマークがダブっていますが、読み替えてください。
|
- よしだひろゆき
- 大ベテラン
- 会議室デビュー日: 2004/11/22
- 投稿数: 141
|
投稿日時: 2006-08-11 15:11
引用: |
| f:viewタグを前後に、レスポンスのエンコーディングが変わってしまっていました。
|
ちょっと調べてみました。
ViewTag.doStartTag()に以下のような処理がありました。
pageContext.getResponse().setLocale(facesContext.getViewRoot().getLocale());
UIViewRootのjavadocによるとgetLocaleは
If we have a locale ivar, return it. If we have a value binding for "locale", get its value. If the value is null, return the result of calling ViewHandler.calculateLocale(javax.faces.context.FacesContext).
だそうなので、さらにViewHandler.calculateLocaleは
Returns an appropriate Locale to use for this and subsequent requests for the current client.
ということで、これ以上はよく分かりませんが、二つの環境でデフォルトのlocaleが違っているというようなことはありませんか?
以上、ご参考まで。
|
- かしん
- 常連さん
- 会議室デビュー日: 2004/08/27
- 投稿数: 25
- お住まい・勤務地: 窓際
|
投稿日時: 2006-08-11 20:37
よしだひろゆきさん
コメントありがとうございます。
同じマシンでそれぞれ動かしていまして、facesContext.getViewRoot().getLocale()はどちらも「ja_JP」でした。
ServletResponse#setLocale()メソッドについて、javadocを見たところ、以下の記述を見つけました。
引用: |
| レスポンスのロケールをセットしますが、このとき(Content-Type で指定する文字エンコーディングを含む)ヘッダも適当な値にセットします。 このメソッドは getWriter() メソッドよりも前に呼び出しておくべきです。 デフォルトではレスポンスのロケールはサーバの デフォルトロケールです。
|
ということで、下記のコードをf:viewタグの前に追加してみました。
コード: |
|
:
:
<% System.out.println(pageContext.getResponse().getCharacterEncoding());%>
<% pageContext.getResponse().setLocale(java.util.Locale.getDefault()); %>
<% System.out.println(pageContext.getResponse().getCharacterEncoding());%>
<f:view>
:
:
|
Tomcat4.1系の実行結果としては、
UTF-8
Shift_JIS
でした。
引用: |
| ググったところ、org.apache.coyote.Response.javaにバグがあるようで、これが関連しているようです。
とりあえず原因がわかったので、安心しました。
|
#上記が誤った情報であるため、修正します。
#4.1系と5.5系でorg.apache.catalina.connectorパッケージの実装が変わっており、
#5.5系では、org.apache.coyote.Responseを使用して、正しく動作しています。
#4.1系では、org.apache.catalina.connector.ResponseBaseの実装として、
#setLocaleメソッド内で、org.apache.catalina.util.CharSetMapperクラスが保持するプロパティファイルから、ja=Shift_JISでcharsetを取得しており、それが今回の原因となっていました。
ご協力ありがとうございました。
[ メッセージ編集済み 編集者: かしん 編集日時 2006-08-17 14:58 ]
|