我在我的Web应用程序(JSF 1.2,Spring和Tomcat 7)中遇到了字符集编码的问题,而且我已经用尽了测试内容以查看它出错的地方。
每当我提交类似'çã'的内容时,我会得到'çã':这意味着我的数据被发布为 UTF-8 ,正在JSF生活中的某个地方转换为ISO-8859-1周期。
我知道错误的转换是UTF-8到ISO-8859-1导致它的输出相同:
System.out.println(new String("çã".getBytes("UTF-8"), "ISO-8859-1"));
我认为错误的转换是在JSF生命周期的某个地方(它可以在之前吗?)因为我在我的MB中设置了验证器:
public void debugValidator(FacesContext context, UIComponent component,
Object object) throws ValidationException {
System.out.println("debug validator:");
System.out.println(object);
System.out.println("\n");
throw new ValidationException("DEBUG: " + object.toString());
}
并将其消息返回为:“DEBUG:çã”
<?xml version="1.0" encoding="UTF-8"?>
。CharacterEncodingFilter
将请求字符编码设置为UTF-8。URIEncoding="UTF-8"
放在Tomcat的server.xml
文件中,只是为了保证你知道我还能测试什么吗?什么可能是我的错误假设?
提前致谢!
答案 0 :(得分:7)
这是我使用的过滤器:
<!-- filter enforcing charset UTF-8 - must be first filter in the chain! -->
<filter>
<filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
显然,在过滤器设置参数之前读取了数据。 我从这个页面得到了提示:http://tech.top21.de/techblog/20100421-solving-problems-with-request-parameter-encoding.html
谢谢大家!
答案 1 :(得分:3)
症状表明浏览器使用ISO-8859-1编码而不是UTF-8发送数据。这反过来意味着没有使用正确的Content-Type
属性设置HTTP响应charset
标头。例如,Firebug,您可以按如下方式找到它:
你是对的,Facelets默认使用UTF-8。但是早期版本的Facelets没有被编程为默认使用UTF-8。另请参阅其他issue 46和issue 53。 Facelets目前位于1.1.15.B1。
关于你修复它的尝试,XML prolog的存在并不是绝对必要的,并且它的编码不以任何方式用于设置响应编码,它仅由XML解析器用于将输入流解码为字符。 Spring的过滤器也没有必要,但是在你添加它之后它没有解决问题,这足以证明它是以ISO-8859-1发送数据的客户端。
答案 2 :(得分:1)
检查您的表单是否有enctype="multipart/form-data"
。
请参阅this question表单了解更多信息