JavaサーブレットファイルのUTF-8に問題があります。URLでパラメータ値を取得すると、UTF-8文字に問題があります。日本語の文字が正しく表示されません。
Jspヘッダーにはすでに
_<%@ page language="Java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
_
コネクターのURIEncoding設定をserver.xmlのUTF-8に追加しました。
_<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
_
私はjspで次のようにコードを書きました。
_<s:textfield key="txt_name" name="txt_name" id="txt_name"
maxlength="64"></s:textfield>
<a href="javascript:showModalWindow('PopUpFile!init.action?<%=Common.PASSWORD%>=<%=Common.encript(ID, Code)%>','',940,650);">
<s:property value="PopUp Link" />
</a>
<script>
function showModalWindow(x_URL, x_ARG, x_WIDTH, x_HEIGHT) {
var x_OPT = "dialogHeight: " + x_HEIGHT + "px; " + "dialogWidth: "
+ x_WIDTH + "px; "
+ "Edge: Raised; center: Yes; resizable: Yes; status: Yes;";
x_URL += "&name="+document.getElementById("txt_name").value;
var retValue = window.showModalDialog(x_URL, x_ARG, x_OPT);
if (retValue != null) {
document.forms.frm.action = "ParentFile!getUser.action";
document.forms.frm.submit();
}
}
</script>
_
そして、Javaサーブレットで次のようにコードを書きました。
_if(g_request.getParameter("name") != null){
g_session.setAttribute(NAME, g_request.getParameter("name"));
}
_
また、Javaサーブレットでrequest.setCharacterEncoding()
メソッドを使用してテストしましたが、実際には機能しません。サーブレットでの文字エンコードに関連する他の人の問題の回答から多くの方法を試しましたがstackoverflowでは、まで問題を解決できません。
文字エンコードを正しく表示するにはどうすればよいですか?前もって感謝します。
Apache Tomcatサーバーを含むほとんどのサーバーは、デフォルトで_ISO-8859-1
_を使用したパラメーターエンコーディングに構成されています。プライベート専用サーバーインスタンスがない限り、これを変更することはないと思います。したがって、プログラマーの手法は、これらのパラメーターを手動でエンコード/デコードすることです。 javascriptを使用しているため、encodeURI()
またはencodeURIComponent()
組み込み関数があります。 JavaScriptでURLをエンコードする方法 を参照してください。コードを変更する必要があります
_x_URL += "&name="+encodeURI(document.getElementById("txt_name").value);
_
Javaでは、URLDecoder
を使用してパラメータをデコードし直します。
_Java.net.URLDecoder.decode(((String[])request.getParameterMap().get("name"))[0], "UTF-8"));
_
Struts2 dispatcher
結果タイプを使用している場合は、クエリ文字列のパラメータをデコードする必要がないことに注意してください。これらのパラメーターは、UrlHelper
を介して解析されます。
ただし、これらのパラメーターをいつデコードするかは、Struts2で自動的にデコードされることを覚えていません。
原則として、URLでパラメーターを渡す場合は、URLエンコードする必要があることを知っておく必要があります。フォームは_x-www-form-urlencoded
_であるため、フォームを送信する必要はありません。 17.13.4フォームのコンテンツタイプ を参照してください。
_System.out.println
_を使用して出力をテストしていますか?その場合は、UTF-8用に構成されていない可能性があります。
これを参照してください: JSPからサーブレットに特殊文字(UTF-8)を送信できません:疑問符が表示されます
また、パラメータを読み取る前に、必ずrequest.setCharacterEncoding("UTF-8")
を実行してください。
同様のエラーがあり、Springを使用している場合はサーブレットフィルターを使用して解決します。この定義をweb.xmlに追加するだけです。
<!-- CharacterEncodingFilter / UTF-8 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
springを使用していない場合は、次のようなサーブレットフィルタを記述します。
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
//Set character encoding as UTF-8
request.setCharacterEncoding("UTF-8");
filterChain.doFilter(request, response);
}
コメントを f.khantsis から回答にエスカレートしたいと思います。私の場合、それが重要であることが判明したからです。
重要:このフィルターが他のフィルターよりも先に最初に実行されることを確認してください。そうしないと、機能しません。
サーブレットフィルタに正しいエンコーディング設定がありました。
request.setCharacterEncoding("UTF-8");
しかし、request.getParameter
にブレークポイントを設定すると、エンコードを設定する前にパラメーターを読み取っていることがわかりました。別のフィルター(csrf)で発生していました。この時点で、エンコーディングはフリーズし、さらに設定しても効果がありませんでした。これはサーバーに依存する可能性がありますが、私たちの場合(Websphere)はそうでした。