Java Spring MVC和UTF-8:如何处理瑞典特殊角色?

Java Spring MVC和UTF-8:如何处理瑞典特殊角色?,java,spring,spring-mvc,utf-8,character-encoding,Java,Spring,Spring Mvc,Utf 8,Character Encoding,我试图在我的数据库中找到带有瑞典特殊字符“bäck”的单词, 我有一个jsp页面: <%@ page pageEncoding="utf-8" contentType="text/html; charset=utf-8" %> ... <form name="mainform" action="/web/admin/users/"> <input id="keywords" type="text" name="keywords" size="30"

我试图在我的数据库中找到带有瑞典特殊字符“bäck”的单词, 我有一个jsp页面:

<%@ page pageEncoding="utf-8" contentType="text/html; charset=utf-8" %>
    ...
<form name="mainform" action="/web/admin/users/">
    <input id="keywords" type="text" name="keywords" size="30"
           value="${status.value}" tabindex="1" />
    <button class="link" type="submit">Search</button>
</form>
web.xml

<web-app ...>
...
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>test.testdomain.spring.RequestResponseCharacterEncodingFilter</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>
...
</web-app>

...
编码滤波器
test.testdomain.spring.RequestResponseCharacterEncodingFilter
编码
UTF-8
强制编码
真的
编码滤波器
/*
...
当我开始寻找“bäck”这个词时,它看起来是这样的
bÃck
。请求被编码到UTF-8中:

但就在我退出调试器中过滤器中的
doFilterInternal
方法之前,我看到:

我做错了什么?为什么文本没有编码成UTF-8

编辑:这很奇怪,我刚刚尝试在Chrome和Mozilla Firefox中进行查询,结果很好,所以我觉得只有在Internet Explorer中才有这个问题


编辑:Internet Explorer给了我这个字符串:
b%C3%A4ck
但是Mozilla Firefox和Chrome给了我这个字符串:
b%E4ck
。它们显然不同,这是为什么?

您的屏幕截图表明您的搜索关键字bäck作为URL的一部分,作为URL参数发送。它还表明,这项工作似乎正确的UTF-8URL编码。调试器中返回的字符串是UTF-8编码字节的典型ISO拉丁语解码:例如,HTTPServletRequest解析器对UTF-8编码字符串使用ISO拉丁语解析

因此,您的ServletFilter对解释它毫无帮助:

request.setCharacterEncoding(this.encoding);
response.setCharacterEncoding(this.encoding);
因为正如javadoc所说:这些方法在HTTP请求体上工作,而不是在其URL上

/**
 * Overrides the name of the character encoding used in the body of this
 * request. This method must be called prior to reading request parameters
 * or reading input using getReader(). Otherwise, it has no effect.
 * 
看到URL参数解析是Servlet容器的职责,您应该查看的设置可能是容器级别的设置。 例如,在Tomcat上,如文档中所述:

URIEncoding:指定在%xx解码URL后,用于解码URI字节的字符编码。如果未指定,将使用ISO-8859-1

默认情况下,它使用ISO-8859-1。您应该将其更改为UTF-8,然后,您的请求参数将从servlet容器中正确解析,并传递给HTTPServletRequest对象

编辑:当您看到不一致的浏览器行为时,您可以查看HTML表单的一致性。请确保

  • HTTP内容类型头和定义字符集的HTML“meta”标记在声明字符集时都是存在的,并且是一致的。(给定servlet过滤器,它们都应该是UTF-8)
  • 您实际上尊重响应主体中的字符集声明(实际上是从JSP编写UTF-8字符串,或者其他任何内容)

  • IE将其编码标记为ISO-8859-。。。?检查HTML源代码。添加
    或在HTML 5中添加
    。检查发送的标题,例如在Firerox with TamperData插件中。总的来说,它似乎是正确的:DB检索,输出。我应该更仔细地阅读javadoc:)我将
    GET
    方法更改为
    POST
    方法,它工作了。谢谢,伙计。
    /**
     * Overrides the name of the character encoding used in the body of this
     * request. This method must be called prior to reading request parameters
     * or reading input using getReader(). Otherwise, it has no effect.
     *