乱码问题

在做Spring Web程序的时候,又遇到了乱码问题!

情况是这样的,所有的 *.jsp , *.java, *.xml 文件都采用了UTF-8编码. 而且在所有的 *.jsp 文件中,都指定了 <%@ page session="false" contentType="text/html;charset=UTF-8" %>

刚开始的时候, 系统运行的很好,比如在一个简单控制器中有:

...
[color=blue]response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<script>alert(\"错了\");window.history.go(-1);</script>");
out.close;
return null;[/color]
执行后,成功地弹出了中文警告信息. 值得注意的是这里必须通过 response.setContentType 设置响应信息的编码, 因为处理器所在的java文件,采用了UTF-8编码 ,也就是中文 "错了" 这两个字实际上用的是UTF-8的编码. 如果不指定响应信息的编码,中文系统下的浏览器会使用 GB2312 来解码响应信息, 结果自然就是乱码了, 而在响应头中指定了UTF-8编码后, 浏览器会自动用 UTF-8 解码信息, 结果就对头咯.

好拉, 似乎没什么问题了, 但在写完一个表单处理器和相应的jsp后 , 页面提交的中文数据到后台就变成乱码了 !! :oops:

为什么? JSP文件是按UTF-8编码编写的,而且已经指定了 [color=blue]<%@ page session="false" contentType="text/html;charset=UTF-8" %> [/color],那么浏览器为什么没有按照 [b]UTF-8[/b] 的编码提交数据呢 ?

后台处理器得到的命令对象是 course ,有 name 和 author 这两个属性:
在经过下面的处理后

[color=blue] String name = course.getName();
name = new String(name.getBytes("ISO8859_1"),"UTF-8");[/color]
得到了正确的中文显示!
看来确实有什么东西把我们UTF-8编写的数据,在传递过程中,进行了ISO8859_1编码 !

是Tomcat5.0.30干的么 ? 事实证明跟Tomcat没关系!

我修改了默认的 service.xml 配置, 在
[color=brown]<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" />[/color]中增加了 URIEncoding="UTF-8" ,结果,没有什么变化.

那么只有一个解释了, 那就是浏览器. 也就是浏览器 (不论IE,NS) 把输入的UTF-8编码的数据, 以 ISO8859_1 的编码方式 发送了出去. 不是我瞎猜, 我在 Spring 提供的 过滤器 原代码注释中 看到了这样一句话: [b]Servlet 2.3 Filter that allows one to specify a character encoding for requests. This is useful because current browsers typically do not set a character encoding even if specified in the HTML page or form.[/b]

可以这样翻译:
"[b]Servlet 2.3 规范支持的过滤器允许开发者指定请求的字符编码. 这是很有用的,因为目前典型的浏览器不会设置字符编码,即使已经在页面或者表单指定了[/b]", 也就是说, 尽管我在jsp页面中指定了<%@ page session="false" contentType="text/html;charset=UTF-8" %>, 浏览器也不会按照UTF-8编码发送我输入的数据.

现在没办法了, 只有去 web.xml 配置过滤器了. 直接使用了 org.springframework.web.filter.CharacterEncodingFilter, 好啦, POST提交的乱码问题彻底解决了, 注意, 我没有说 GET 哦.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值