将UTF8输入从JSP表单传输到Spring控制器会破坏变音符号

Ste*_*fan 5 html java jsp spring-mvc utf-8

可能重复:
UTF-8编码和http参数

我有一个带有纯UTF8标头的UTF8编码的JSP(文本文件也编码为UTF-8)和该页面内的表单:

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head>
<body>
This is a funny German character: ß
<form action="utf.do" method="post">
<input type="text" name="p" value="${p}" />
<input type="submit" value="OK"/>
</form>
Run Code Online (Sandbox Code Playgroud)

然后我在后端有一个很好的Spring支持的@Controller:

@Controller
public class UTFCtl {
@RequestMapping("/utf.do")
public ModelAndView handleUTF(@RequestParam(value="p", required=false) String anUTFString) {
    ModelAndView ret = new ModelAndView("utf");
    ret.addObject("p", anUTFString);
    return ret;
     }
 }
Run Code Online (Sandbox Code Playgroud)

如您所见,表单通过POST传输其数据.在表单字段中键入一些德语变音符会在后端产生一堆破碎的字符.因此hähöhü,在提交后,在表单字段上提交会产生hähöhü值.我使用了调试器并且var值已经被加扰,这意味着Spring/Tomcat/Servlet没有正确检测到编码,或者浏览器没有正确编码我的输入.同事们对此的通常回应是:在ISO中对德国进行编码或在传输之前使用Javascript进行编码.这不应该是必要的,不是吗?我的意思是,这是2011年,这就是UTF8的优点!

[编辑]我认为即使我告诉他使用UTF8,这也证明输入是作为ISO输入的:

byte[] in = anUTFString.getBytes("iso-8859-1");
String out = new String(in,"UTF-8");
Run Code Online (Sandbox Code Playgroud)

然后在JSP中正确显示out!

我在Tomcat 5.5上使用Spring 2.5,在Windows XP SP3盒子上使用Firefox 4 beta 11.我已经告诉Tomcat使用它,URIEncoding="utf-8"但这不会改变游戏.我使用Firebug分析了Firefox传输,它似乎传输了UTF8.我还检查了当前的Spring WebMVC设置和IMO,在任何地方都没有进一步的编码转换器,不在配置中,也没有在web.xml中(没有听众,没有) - 我阅读并理解了大多数UTF-8相关文档和我在PHP环境中工作没有任何问题(只需将PHP切换到utf-8,完成)...

Ste*_*fan 3

所以,这确实也是服务器设置的问题。请注意问题下方的重复评论。您必须告诉您的服务器以及您的部署使用 utf-8,然后一切都很好(与 PHP 中非常相似)。请注意,我在这里复制答案(http://ibnaziz.wordpress.com/2008/06/10/spring-utf-8-conversion-using-characterencodingfilter/)。

\n\n

这适用于 Tomcat 环境:

\n\n

编辑 Tomcat 的 server.xml 连接器以提供 UTF-8:\n<Connector URIEncoding="utf-8" port="8080" blabla="blabla" ... >

\n\n

然后添加到您的 web.xml:

\n\n
<filter>\n    <filter-name>encodingFilter</filter-name>\n<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>\n<init-param>\n        <param-name>encoding</param-name>\n        <param-value>UTF-8</param-value>\n    </init-param>\n    <init-param>\n        <param-name>forceEncoding</param-name>\n        <param-value>true</param-value>\n    </init-param>\n</filter>\n\n<filter-mapping>\n    <filter-name>encodingFilter</filter-name>\n    <url-pattern>/*</url-pattern>\n</filter-mapping>\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将告诉 Spring 框架对所有类型的请求应用 UTF-8 过滤器 (/*​​)。应用此后,您甚至可以拥有格式为 ?q=\xc3\xa4\xc3\xb6\xc3\xbc\xc3\x9f 的链接,该链接将被正确传输。尽管最好对请求传输的参数进行编码:

\n\n

URLEncoder.encode(aParameterWithUmlaut,"UTF-8")

\n