将请求参数作为UTF-8编码的字符串传递

时间:2012-06-12 18:42:46

标签: jsp servlets utf-8 character-encoding

我正在创建一个简单的登录页面,我想将登录名和密码参数作为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>

5 个答案:

答案 0 :(得分:48)

pageEncoding仅设置HTTP charset标头的响应字符编码和Content-Type属性。基本上,它告诉服务器在将JSP发送到客户端之前将JSP生成的字符解码为UTF-8,并且标头告诉客户端使用UTF-8对它们进行编码,并且当同一页面中的任何表单是要提交回服务器。 contentType已默认为text/html,因此以下就足够了:

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

通过HTTP提供页面时,将忽略HTML元标记。它仅在客户端将页面保存为本地磁盘系统上的HTML文件并且然后在浏览器中由file:// URI打开时使用。

在您的特定情况下,HTTP请求正文编码显然未设置为UTF-8。请求体编码需要由servlet中的ServletRequest#setCharacterEncoding()或过滤器设置,然后才能在请求中涉及的任何servlet或过滤器中对request.getXxx()进行第一次调用。

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

另见:

答案 1 :(得分:5)

调用ServletRequest #setCharacterEncoding()在某些情况下仍会失败。

如果你的容器小心地遵循servlet规范(和tomcat一样),它默认将post参数解释为ISO-8859-1。这可能会在他们访问您的代码之前将UTF-8字符(例如我最近使用过的案例中的日语)弄乱,特别是如果您有一个使用getParameter()或{{1}检查请求参数的servlet过滤器}。这两种方法强制解码参数,解码只进行一次。

如果你有查看请求参数的过滤器,这里有一个如何在Tomcat中解决这个问题的链接。人们会想要检查他们特定容器的文档。

http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q1

关键是:

添加

getParameters()

到Tomcat的server.xml中的Context元素并添加

useBodyEncodingForURI="true" URIEncoding="UTF-8"

之前在web.xml中调用getParameter()或getParameters()的任何过滤器。我发现尽管上面的链接使得context元素的两个属性看起来像是替代,但是useBodyEncodingForURI是绝对必要的,或者tomcat不会为查询字符串设置编码。来自tomcat 7.0.42中的Request.java:

  <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>

答案 2 :(得分:2)

问题取决于使用哪个应用程序服务器。甚至页面都是正确设置的,例如对于UTF8,尝试以正确的形式获得参数(根据预期的语言)不会产生良好的结果,即request.getParameter(...)返回不是预期的字符,因为参数的默认代码页大多是8859-1。这意味着,参数的代码页独立于JSP页面的代码页,参数的默认代码页影响结果。最好的描述,我发现在这里: [1]: http://docs.cksource.com/CKFinder_2.x/Developers_Guide/Java/Configuration/URI_Encoding。 在某些应用程序服务器中,&#34; request.setCharacterEncoding(...)&#34;没有效果。您必须在描述符中设置参数编码。最复杂的是JBoss,Apache Tomcat,中间是Glassfish。更好的是WebLogic,最好的是Jetty(UTF-8是默认设置)。在我的情况下,我必须创建glassfish-web.xml描述符并将参数编码标记放在那里。就我而言(GlassFish):

<glassfish-web-app error-url="">
  <!-- request.setCharacterEncoding("UTF-8") not functioning -->
  <parameter-encoding default-charset="UTF-8" />
</glassfish-web-app>

答案 3 :(得分: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 docs

注意:我在_JAVA_OPTIONS中也有这些选项,但不知道是否有必要。

-Dweblogic.webservice.i18n.charset=utf-8 
-Dfile.encoding=UTF-8

答案 4 :(得分:0)

示例字符编码:

<%@ page language="java" pageEncoding="utf8" contentType="text/html;charset=UTF-8" %>