1 起初Servlet 没有处理 request的编码 即 没有
request.setCharacterEncoding("UTF-8");
这中情况下,提交过来的中文,通过servlet处理后,显示在页面上,正常
但是在Serlvet里,用System.out.println()打印的结果是乱码,这其实说明在java代码使用的字符串,其实是不正确的,不能进行有效的比较判断和处理。
2 在Servlet里添加
request.setCharacterEncoding("UTF-8");
这时System.out.println的输出是正常的,但是页面的出现乱码
这说明java代码里处理的字符串是正确的
request.setCharacterEncoding("UTF-8");
这时System.out.println的输出是正常的,但是页面的出现乱码
这说明java代码里处理的字符串是正确的
3 在Servlet里添加
response.setContentType("text/html; charset=UTF-8");
全ok了
response.setContentType("text/html; charset=UTF-8");
全ok了
理论:
1 encodingURI处理过后的字符串 应当 被当作utf8编码过的处理
2 Serlvet 在 默认(request.getCharacterEncoding() == null时) 认为request 的编码是“ISO-8859-1”
3 浏览器处理服务器的消息会根据 Httpresponse的头的contentType判断采用哪种编码。
1 encodingURI处理过后的字符串 应当 被当作utf8编码过的处理
2 Serlvet 在 默认(request.getCharacterEncoding() == null时) 认为request 的编码是“ISO-8859-1”
3 浏览器处理服务器的消息会根据 Httpresponse的头的contentType判断采用哪种编码。
解释:
过去框架里有个处理request的Filter,其中只有一句有效的代码,即
request.setCharacterEncoding("UTF-8");
而我们的响应总是通过 struts action forward到 jsp 完成的,而jsp 中肯定会有 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
其实就相当于 Sevlet里 的response.setContentType("text/html; charset=UTF-8");
注释:
根据个人理解(依据jsp标准描述,并没有明确说明)
pageEncoding="UTF-8" 是告诉jsp容器将jsp转换成为java Servlet代码的时候使用什么字符集解释jsp文件。
后记:
字符集,编码属于国际化的问题,是java的基础问题。也许太基础了,总是被程序员遗忘。但如果基础的问题处理不好,是会产生大麻烦的。