java - 将 UTF8 输入从 JSP 表单传输到 Spring Controller 会破坏变音符号

标签 java html jsp spring-mvc utf-8

<分区>

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,完成)...

最佳答案

所以,这确实也是服务器设置的问题。请注意问题下方的重复评论。你必须告诉你的服务器以及你的部署使用 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")

关于java - 将 UTF8 输入从 JSP 表单传输到 Spring Controller 会破坏变音符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5064256/

相关文章:

javascript - 如何为文本框应用 ng-if

java - HTTP 状态 500 : When using form:input tag in jsp

java - 如何在测验结束时存储和显示分数

java - 在Android中处理ALPHA_8位图并显示在ImageView中

具有可抢占线程队列的java执行器

php - 桌面网站上的汉堡包菜单(带有小尺寸图标),用于切换单击时的全宽和高度下拉菜单(Bootstrap 4)

javascript - 如果输入了正确的信息,我怎样才能使按钮亮起?

java - 不兼容的类型 : inference variable E#1 has incompatible upper bounds Enum<E#2>

java - 确定评估整数规则时的互斥

java - 从另一个 JSP 文件读取变量