単純なログインページを作成していますが、ログインパラメータとパスワードパラメータをUTF-8エンコード文字列として渡したいと思います。以下のコードを見るとわかるように、最初の行はエンコードをUTF-8に設定した場所ですが、機能しないので無意味なようです。ログインパラメータとパスワードパラメータをアクセント付きで使用すると、結果ページに奇妙な文字が表示されます。
すべてのブラウザで機能するように文字エンコードを正しく設定する方法は?
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>My Page</title>
</head>
<body>
<h1>Welcome to My Page</h1>
<form name="login" action="login.jsp" method="POST">
Login:<br/>
<input type="text" name="login" value="" /><br/>
Password:<br/>
<input type="password" name="password" value="" /><br/>
<br/>
<input type="submit" value="Login" /><br/>
</form>
</body>
</html>
pageEncoding
は、応答文字エンコードと、HTTP Content-Type
ヘッダーのcharset
属性のみを設定します。基本的に、JSPによって生成された文字をUTF-8としてクライアントに送信する前にデコードするようにサーバーに指示し、ヘッダーはUTF-8を使用してエンコードし、まったく同じページのフォームがある場合に使用するようにクライアントに指示しますサーバーに送信します。 contentType
はデフォルトでtext/html
にデフォルト設定されているため、以下で十分です。
<%@page pageEncoding="UTF-8"%>
ページがHTTP経由で提供される場合、HTMLメタタグは無視されます。ページがクライアントによってローカルディスクシステムにHTMLファイルとして保存され、thenブラウザーのfile://
URIによって開かれた場合にのみ使用されます。
特定のケースでは、HTTPリクエストのボディエンコーディングがUTF-8に設定されていないようです。リクエストボディエンコーディングは、サーブレットまたはフィルタで ServletRequest#setCharacterEncoding()
で設定する必要がありますbeforerequest.getXxx()
の最初の呼び出しは、リクエストに関係するサーブレットまたはフィルター。
request.setCharacterEncoding("UTF-8");
String login = request.getParameter("login");
String password = request.getParameter("password");
// ...
ServletRequest#setCharacterEncoding()の呼び出しは、場合によっては失敗します。
コンテナが(Tomcatのように)サーブレットの仕様に注意深く従っている場合、デフォルトでpostパラメーターをISO-8859-1として解釈します。これは、特にgetParameter()
またはgetParameters()
。これらの2つのメソッドは、パラメーターのデコードを強制し、デコードは一度だけ行われます。
要求パラメーターを調べるフィルターがある場合、Tomcatでこれを回避する方法のリンクを次に示します。人々は特定のコンテナのドキュメントをチェックしたいと思うでしょう。
http://wiki.Apache.org/Tomcat/FAQ/CharacterEncoding#Q1
その重要な点は次のとおりです。
追加する
useBodyEncodingForURI="true" URIEncoding="UTF-8"
tomcatのserver.xmlのContext要素に追加して
<filter>
<filter-name>Character Encoding Filter</filter-name>
<filter-class>org.Apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Character Encoding Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
以前と同様、web.xmlでgetParameter()またはgetParameters()を呼び出すフィルター。上記のリンクにより、コンテキスト要素の2つの属性は代替のように見えますが、useBodyEncodingForURIが絶対に必要であるか、Tomcatがクエリ文字列のエンコーディングを設定しません。 Tomcat 7.0.42のRequest.Javaから:
boolean useBodyEncodingForURI = connector.getUseBodyEncodingForURI();
if (enc != null) {
parameters.setEncoding(enc);
if (useBodyEncodingForURI) {
parameters.setQueryStringEncoding(enc);
}
} else {
parameters.setEncoding
(org.Apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);
if (useBodyEncodingForURI) {
parameters.setQueryStringEncoding
(org.Apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);
}
}
問題はそれに依存しており、どのアプリケーションサーバーが使用されています。ページでも正しく設定されています。 UTF8の場合、正しい形式(予想される言語による)でパラメーターを取得しようとしても、良い結果が得られません。つまり、request.getParameter(...)は、パラメーターのデフォルトコードページがほとんど8859-1であるため、予期しない文字を返します。つまり、パラメーターのコードページはJSPページのコードページに依存せず、パラメーターのデフォルトのコードページは結果に影響します。私が見つけた最良の説明はここにあります: [1]:http://docs.cksource.com/CKFinder_2.x/Developers_Guide/Java/Configuration/URI_Encoding 。一部のアプリケーションサーバーでは、「request.setCharacterEncoding(...)」は効果がありません。記述子でパラメーターのエンコードを設定する必要があります。最も複雑なのはJBoss、Apache Tomcat、真ん中はGlassfishです。より良いのはWebLogicで、最も良いのはJettyです(UTF-8がデフォルト設定です)。私の場合、glassfish-web.xml記述子を作成し、そこにparameter-encodingタグを配置する必要があります。私の場合(GlassFish):
<glassfish-web-app error-url="">
<!-- request.setCharacterEncoding("UTF-8") not functioning -->
<parameter-encoding default-charset="UTF-8" />
</glassfish-web-app>
私は最近この問題に遭遇し、ここで答えを見つけることができませんでした。 Weblogicを使用していますが、ほとんどのソリューションはTomcat用です。
エンコードをWeblogicで機能させるには、これをweblogic.xml
<charset-params>
<input-charset>
<resource-path>/*</resource-path>
<Java-charset-name>UTF-8</Java-charset-name>
</input-charset>
</charset-params>
ソース: weblogic.xml docs
注:これらのオプションは_Java_OPTIONSにもありますが、必要かどうかわかりません。
-Dweblogic.webservice.i18n.charset=utf-8
-Dfile.encoding=UTF-8
サンプル文字エンコード:
<%@ page language="Java" pageEncoding="utf8" contentType="text/html;charset=UTF-8" %>