26

簡単なログインページを作成していて、ログインとパスワードのパラメーターを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>
4

5 に答える 5

48

pageEncoding応答文字エンコーディングとHTTPヘッダーのcharset属性を設定するだけです。Content-Type基本的に、JSPによって生成された文字をUTF-8としてデコードしてからクライアントに送信するようサーバーに指示し、ヘッダーはクライアントにUTF-8を使用してそれらをエンコードし、まったく同じページのフォームがサーバーに送信されます。contentTypeすでにデフォルトであるため、text/html以下で十分です。

<%@page pageEncoding="UTF-8"%>

ページがHTTP経由で提供される場合、HTMLメタタグは無視されます。これは、ページがクライアントによってローカルディスクシステムにHTMLファイルとして保存され、ブラウザのURIによって開かれた場合にのみ使用されます。file://

特定のケースでは、HTTPリクエストの本文のエンコーディングがUTF-8に設定されていないようです。リクエストに含まれるサーブレットまたはフィルタで最初の呼び出しが行われる前にServletRequest#setCharacterEncoding()、リクエスト本文のエンコーディングをサーブレットまたはフィルタで設定する必要があります。request.getXxx()

request.setCharacterEncoding("UTF-8");
String login = request.getParameter("login");
String password = request.getParameter("password");
// ...

参照:

于 2012-06-12T18:49:39.117 に答える
5

ServletRequest#setCharacterEncoding()の呼び出しは、場合によっては失敗します。

コンテナがサーブレット仕様に注意深く従う場合(tomcatと同様)、デフォルトでpostパラメータをISO-8859-1として解釈します。これにより、UTF-8文字(最近の場合は日本語など)がコードに到達する前に文字化けする可能性があります。特に、getParameter()またはを使用して要求パラメーターを検査するサーブレットフィルターがある場合はそうですgetParameters()。これらの2つの方法では、パラメーターのデコードが強制され、デコードは1回だけ実行されます。

リクエストパラメータを調べるフィルタがある場合、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);
    }
}
于 2013-10-16T17:09:09.303 に答える
2

問題は、どのアプリケーションサーバーが使用されているかに依存します。ページがUTF8などに正しく設定されている場合でも、(予想される言語に従って)正しい形式でパラメーターを取得しようとしても、良い結果は得られません。つまり、パラメーターのデフォルトのコードページは次のようになります。主に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>
于 2014-05-13T12:37:26.477 に答える
1

私は最近この問題に遭遇し、ここで答えを見つけることができませんでした。私は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ドキュメント

注:_JAVA_OPTIONSにもこれらのオプションがありますが、それらが必要かどうかはわかりません。

-Dweblogic.webservice.i18n.charset=utf-8 
-Dfile.encoding=UTF-8
于 2016-05-24T12:22:34.113 に答える
0

サンプル文字エンコーディング:

<%@ page language="java" pageEncoding="utf8" contentType="text/html;charset=UTF-8" %>
于 2012-06-12T18:55:21.530 に答える