首先,把我遇到的乱码问题分为三大类:
- 一是JSP页面中文乱码
- 二是表单提交方式为post/get时出现乱码
- 三是cookie存储输出value出现乱码
而出现乱码的根本原因是:编码和解码方式不同。
一、JSP页面中文乱码
首先明确一点,ISO-8859-1编码方式不识别中文。下图中,把中文字符“我是中文”用ISO-8859-1编码后载解码输出,就乱套了:
而我们采用UTF-8的方式编码再解码,不会出现乱码:
1.问题描述
回归正题,这个JSP页面中文乱码问题是指,在记事本(jsp编辑器)中,写入中文
但是浏览器运行jsp页面时,全变成了乱码:
我又去查了它的Java文件,里面的输出语句也是乱码:
2.问题解释及解决
这是因为我们写的文件编码方式是UTF-8,
Tomcat的默认编码是ISO-8859-1,这种编码不识别中文(Tomcat是将jsp文件变为Java文件的,这也就解释了为什么Java文件里的输出语句也是乱码),所以我们需要提醒他它将其编码改成UTF-8,就要在文本最前面加一句(这句话不仅能提醒解码方式,而且也规定了JSP页面的编码方式是UTF-8,就算记事本的默认编码是别的,加上这一句编码方式就改成了UTF-8,我猜的):
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
3.之前讲的都是以默认编码方式为UTF-8的记事本为例,那么用Eclipse开发呢?
注:之前eclipse配置的时候把编码设置改为了UTF-8,改的应该不包括jsp文件,只是改了Java文件的编码方式。
解答:Eclipse中默认JSP文件的编码方式为:ISO-8859-1,如果只把下面的缺省编码改为UTF-8的话,还是无法提示浏览器用什么解码,所以最好的方案是和记事本一样在JSP文件的第一行加一行:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
这样不仅把编码方式改了,而且能提醒浏览器解码时用UTF-8。
如果在配置里面直接更改的话,把图中下面的“默认编码”改成“UTF-8”
二、表单提交方式为post/get时出现乱码
1.问题描述
用表单提交的中文字符,在接收页面显示的是乱码
2.问题解释及解决方法
出现这种情况的原因是:在Tomcat的源代码实现中,默认采用ISO-8859-1方式(要变只能在server.xml下改变Tomcat的配置,但这种方式对提交方式为post时没有用哇)将表单输入信息编码,而Windows系统下浏览器默认的提取方式(解码)却不是ISO-8859-1方式,是GB2312。但是我觉得最直接的原因是ISO根本不识别中文。
解决方法如下,在接收页面将中文字符编码再解码一遍:
下面是对用到的两个函数的解释:
三、cookei的value存入再输出,出现乱码
1.问题描述
将request.getRemoteAddr()获取的地址存入cookie的value中,再输出后是“????”形式的乱码
2.问题解决
查询得知,这是由于cookie的value中存在特殊的符号,request.getRemoteAddr()获取的地址不能直接存储进去,需要以utf-8形式编码后储存:
String newValue=URLEncoder.encode(request.getRemoteAddr(), "utf-8");
Cookie cookie = new Cookie("IP",newValue);
输出时也要采用utf-8的解码方式:
value = URLDecoder.decode(value, "utf-8");