Java Spring MVC和UTF-8:如何处理瑞典特殊角色?
我试图在我的数据库中找到带有瑞典特殊字符“bäck”的单词, 我有一个jsp页面: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"
<%@ 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表单的一致性。请确保
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.
*