那些年
JavaWeb
的各种中文乱码终极解决方法!!
一、Servlet 输出乱码
1. 用 servlet.getOutStream 字节流输出中文,假设要输出的是 String str ="钓鱼岛是中国的,
无耻才是日本的"。
1.1 若是本地服务器与本地客户端这种就不用说了,直接可以 out.write(str.getBytes())可以
输出没有问题。因为服务器中用 str.getBytes()是采用默认本地的编码,比如 GBK。而浏览
器也解析时也用本地默认编码,两者是统一的,所以没有问题。
1.1 若服务器输出时用了, out.write(str.getBytes("utf-8"))。而本地默认编码是 GBK 时(比例
在中国),那么用浏览器打开时就会乱码。因为服务器发送过来的是 utf-8 的 1010 数据,而
客户端浏览器用了 gbk 来解码,两者编码不统一,肯定是乱码。当然,你也可以自己将客
户端浏览器的编码手工调用下(IE 菜单是:查询 View->编码 encoding->utf-8),但是这种操
作很烂,最好由服务器输出响应头告诉,浏览器用哪种编码来解码。所以要在服务器的
servlet 中,增加 response.setHeader("content-type","text/html;charset=utf-8"),当然也可
直接用简单的 response.setContentType("text/hmtl;charset=utf-8")。两种的操作是一样一
样的。
2. 用 servlet.getWirter 字符流输出中文,假设要输出的是 String str ="钓鱼岛是中国的,无
耻才是日本的"。
2.1 若写成 out.print(str)输出时,客户端浏览器显示的将全是多个?????的字符,代表在编
码表中肯定就找不到相应的字符来显示。原因是:servlet.getWriter()得到的字符输出流,
默认对字符的输出是采用 ISO-8859-1,而 ISO-8859-1 肯定是不支持中文的。所以肯定要
首先要做的第一件事:是要将服务器对象输出字符能支持中文的。其次服务器向客户端写
回的响应头要告诉客户端是用了哪种编码表进行编码的。而实现这两个需求,只需要
response.setContentType("text/hmtl;charset=utf-8")。就搞定了。特别注意:
response.setContentType("text/html;charset=utf-8")要放在
PrintOut out = response.getWriter()代码的前面,否则只是有告诉客
户端用什么码表编码的功能,而服务器端还是用 ISO-8859-1 编码了。
再特别提示下:在同一 Servlet 中的 doGet 或 doPost 方法中,不能
既用 response.getOutputStream 又用 response.getWriter,因为这
两种 response 的响应输出字节流与字符流是冲突的,只能用其一。
二、Servlet 文件下载,中文乱码情况。
关键是下载时响应头 content-disposition 中 attachment;filename=文件名。这个文件名
filename 不能是含有中文字符串的,要用 URLEncoding 编码进行编码,才能进行进行 http
的传输。如下代码示例:
[java] view plaincopyprint?