将 UTF8 输入从 JSP 表单传输到 Spring 控制器会破坏元音变音[重复]
Posted
技术标签:
【中文标题】将 UTF8 输入从 JSP 表单传输到 Spring 控制器会破坏元音变音[重复]【英文标题】:transfer UTF8 input from a JSP form to a Spring controller breaks umlauts [duplicate] 【发布时间】:2011-07-01 03:48:33 【问题描述】:可能重复:UTF-8 encoding and http parameters
我有一个 UTF8 编码的 JSP,带有一个纯 UTF8 标头(文本文件也编码为 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>
然后我在后端有一个很好的 Spring-backed @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;
如您所见,表单通过 POST 传输其数据。在表单字段中输入一些德语变音符号会在后端产生一堆崩溃的字符。因此,在表单字段上提交hähöhü
会在提交后生成hähöhü
作为值。我使用了调试器并且 var 值已经被打乱,这意味着 Spring/Tomcat/Servlet 没有正确检测到编码或者浏览器没有正确编码我的输入。同事们对此的通常反应是:在德国使用 ISO 编码或在传输前使用 javascript 编码。这不应该是必需的,不是吗?我的意思是,现在是 2011 年,这就是 UTF8 的优势所在!
[编辑] 我认为这证明输入是作为 ISO 输入的,即使我告诉他使用 UTF8:
byte[] in = anUTFString.getBytes("iso-8859-1");
String out = new String(in,"UTF-8");
然后在 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,完成)...
【问题讨论】:
ibnaziz.wordpress.com/2008/06/10/… 真的很有帮助,并且一次解决了这个问题。之前已经看到了,谢谢你再次指出我。 【参考方案1】:所以,这也是服务器设置的问题。请注意问题下方的重复评论。您必须告诉您的服务器以及您的部署使用 utf-8,然后一切都很好(很像 PHP)。请注意,我在这里复制了答案(http://ibnaziz.wordpress.com/2008/06/10/spring-utf-8-conversion-using-characterencodingfilter/)。
这适用于 Tomcat 环境:
编辑 Tomcat 的 server.xml 连接器以提供 UTF-8:
<Connector URIEncoding="utf-8" port="8080" blabla="blabla" ... >
然后添加到你的 web.xml:
<filter>
<filter-name>encodingFilter</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>
<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>
这将告诉 Spring 框架对所有类型的请求 (/*) 应用 UTF-8 过滤器。应用此功能后,您甚至可以拥有格式为 ?q=äöüß 的链接,这些链接将被正确传输。虽然最好对请求传输的参数进行编码:
URLEncoder.encode(aParameterWithUmlaut,"UTF-8")
【讨论】:
以上是关于将 UTF8 输入从 JSP 表单传输到 Spring 控制器会破坏元音变音[重复]的主要内容,如果未能解决你的问题,请参考以下文章
你可以使用ajax函数将一个变量从jsp发送到一个servlet并在没有表单的情况下同时打开它吗? [复制]