将 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: &lt;Connector URIEncoding="utf-8" port="8080" blabla="blabla" ... &gt;

然后添加到你的 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 控制器会破坏元音变音[重复]的主要内容,如果未能解决你的问题,请参考以下文章

jsp表单提交中文插入数据库,数据库出现问号?

将输入数据从表单传输到贝宝付款,如果付款成功则保存

如何从 servlet 将文本响应流式传输到 jsp?

你可以使用ajax函数将一个变量从jsp发送到一个servlet并在没有表单的情况下同时打开它吗? [复制]

更改表单中的spring jsp日期输入绑定以使用freemarker

在Spring boot中,如何将表单动作中的jsp表单输入的值作为参数传递