一、JSP乱码
这种是最常见的,如果在eclipse中新建一个JSP默认是下面这种:
<%@ page language="java" contentType="text/html;charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
由上述代码可以看出,它默认的页面编码和传输编码都是ISO-8859-1,这是用于欧洲国家的编码。因此,如果想要支持中文的话,需要将ISO-8859-1改为UTF-8。
具体做法,可以先选中ISO-8859-1,然后Ctrl+F,在弹出的窗口中,将ISO-8859-1全部提换为UTF-8,即可。
- 注:上面编码涉及到的两个地方:charset和pageEncoding
charset是指服务器发往客户端展现时的编码。 pageEncoding用于设置JSP页面本身的编码。
JSP在部署后提供给用户使用,会经过三个阶段:
1. JSP生成Java文件:这个阶段会使用pageEncoding所定义的编码格式进行转换。
2. Java文件生成class文件:这个阶段由tomcat服务器自动使用UTF-8把Java文件转换成字节码class文件。
3. 通过读取class文件展现给用户:这个阶段由tomcat服务器获取字节码内容,通过使用contentType所定义的编码格式展示给用户。
二、request中文乱码
在进行表单提交中,在前台注册页面提交部分数据,在处理页面中通过request.getParameter调用时,得到一堆乱码。原因是在前面的JSP中虽然设置了编码格式,但是在当前获取数据的页面中并没有设置获取数据的编码格式。
- 使用下面的代码,设置request获取请求内容的数据编码:
request.setCharacterEncoding("utf-8");
作用:
设置从request中取得的值或从数据库中取出的值的编码方式。
注意事项:
(1)在执行setCharacterEncoding()之前,不能执行任何getParameter()操作。 (2)通过setCharacterEncoding()设置的编码方式只对POST方式提交的表单有效,对GET方式无效。
分析原因:
(1)在执行第一个getParameter()的时候,java将会按照编码分析所有的提交内容,而后续的getParameter()不再进行分析,所以setCharacterEncoding()无效。 (2)对于GET方式提交的表单,提交内容在URL中,一开始就已经按照编码分析提交的内容了,因而setCharacterEncoding()也就无效了。
- setCharacterEncoding()对URL传参这种JSP请求是不起作用的。例如:
<a href="jspControl.jsp?username=胡歌">click</a>
这种情况下任然会出现乱码,这种URL传参的方式,只能修改tomcat服务器的传输编码格式。修改tomcat安装文件apache-tomcat-9.0.14\conf目录下的server.xml,向其中添加URIEncoding="UTF-8",就可以解决URL传递参数造成的中文乱码问题了。
三、Servlet中文乱码
1. post请求乱码处理:
用户在表单中填写的内容在http体中被提交给Servlet.当我们在表单中输入中文时,servlet的request的编码与客户端不一致,则服务器无法解析,则会出现乱码。
解决方法: 改变http请求体中的字符编码对于get无效,因为get提交在请求头中)改变http请求体中的字符编码为UTF8 : request.setCharacterEncoding("UTF-8")
2. get请求乱码处理
URL的参数没有使用编码(即使用了ISO-8859-1等),则在服务器端获取get的参数的时候使用String一个可以指定编码的构造函数。
String username = request.getParameter("username");
String resultname = new String(username.getBytes(IS0-8859-1*","utf-8);
3. 终极解决方法设置中文过滤器
在eclipse中新建一个web工程,然后在Java Resources/src下创建一个名为filter的包,然后在该包中新建一个名为characterEncoding的servlet类,类中内容如下:
接着在WebContent/WEB-INF/web.xml中配置该servlet类,配置内容如下: