<分区>
Possible Duplicate:
UTF-8 encoding and http parameters
我有一个 UTF8 编码的 JSP,带有纯 UTF8 header (文本文件也被编码为 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 没有正确检测到编码或者浏览器没有正确编码我的输入。同事们对此的通常 react 是:在德国使用 ISO 编码或在传输前使用 Javascript 编码。这不应该是必要的,不是吗?我的意思是,现在是 2011 年,而这正是 UTF8 的优势所在!
[编辑] 我认为这证明输入是作为 ISO 传入的,即使我告诉他使用 UTF8:
byte[] in = anUTFString.getBytes("iso-8859-1");
String out = new String(in,"UTF-8");
out 然后在 JSP 中正确显示!
我在 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,完成)...