req.getParameter返回错误的字符编码值

时间:2011-06-28 12:53:16

标签: java jsp character-encoding

我正在尝试使用包含ü,é,à等的getParameter从JSP获取值。但是在servlet中获取错误的值。我用firebug检查了内容类型,发现了

Content-Type    text/html;charset=UTF-8

用firebug检查POST部分并在那里找到正确的值,当我尝试在servlet中访问它时它是错误的。给ö而不是ö

req.getCharacterEncoding(); 

返回null。

尝试设置

 req.setCharacterEncoding("UTF-8");

在servlet的开头但没有帮助。

编辑:

req.getParameter("myValue").getBytes("8859_1"), "utf-8")

以上行给出了正确的值。

2 个答案:

答案 0 :(得分:2)

来自http://wiki.apache.org/tomcat/FAQ/CharacterEncoding

HTTP查询字符串的字符集(这是'GET参数'的技术术语)可以在第2节和第2.1节“URI语法”规范中找到。字符集定义为US-ASCII。任何未映射到US-ASCII的字符都必须以某种方式进行编码。 URI语法规范的2.1节说明US-ASCII之外的字符必须使用%转义序列进行编码:每个字符编码为文字%,后跟两个十六进制代码,表示其字符代码。因此,(US-ASCII字符代码97 = 0x61)等同于%61。在任何地方都没有指定URI的默认编码,这就是解码这些值时存在很多混淆的原因。

在运行Tomcat servlet时,页面确实提到了两种影响此行为的方法:

  • 将server.xml中元素的URIEncoding属性设置为特定的(例如URIEncoding =“UTF-8”)。
  • 将server.xml中元素的useBodyEncodingForURI属性设置为true。这将导致Connector使用请求正文的GET参数编码。

答案 1 :(得分:1)

将以下内容添加到web.xml修复了问题...

<filter>
    <filter-name>charsetFilter</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>
</filter>

<filter-mapping>
    <filter-name>charsetFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>