关于在 JavaWeb 中经常会出现乱码的状况,下面总结一下会出现乱码的情况:
这种是最常见的,设置编码的位置位于 JSP 的第一行,如果在 Eclipse 中新建一个 JSP 默认 是下面这种:
<%@ page language=“java” contentType=“text/html; charset=ISO-8859-1” pageEncoding=“ISO-8859-1”%>
可以看到它默认的页面编码和传输编码都是 ISO-8859-1,这是用于欧洲国家的编码。
如果想要支持中文,可以使用 UTF-8、GB2312、GBK 等,其中 UTF-8 是国际化的, 哪个国家的都支持,所以推荐使用这个。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
charset、pageEncoding 以及 contentType 三者的编码格式需一致。
有时候在做 jsp 逻辑处理时,比如提交表单,从前台注册的页面提交了一部分的数据,但是 后面处理的 JSP 页面通过 request.getParameter 调用时,获取到的是一堆乱码。这是因 为虽然前面 JSP 设置了编码格式,却没有在当前的 JSP 中设置读取数据的编码格式。
1.使用下面的代码,就可以是设置request获取请求内容的数据编码:
request.setCharacterEncoding(“utf-8”);
request.setCharacterEncoding()作用以及使用注意事项:
作用:设置从 request 中取得的值或从数据库中取出的值的编码方式;也就是说该方法 用来指定对浏览器发送来的数据进行重新编码(或者称为解码)时,使用的编码。
使用注意事项:
1)在执行 setCharacterEncoding()之前,不能执行任何 getParameter()操作。
2)通过 setCharacterEncoding 设置的编码方式只对 POST 方式提交的表单有效,对 GET 方式无效。也就是说只对 method="post"方式有效。
分析原因:
1)在执行第一个 getParameter()的时候,java 将会按照编码分析所有的提交内 容,而后续的 getParameter()不再进行分析,所以 setCharacterEncoding()无效。
2)对于 GET 方式提交的表单,提交的内容在 URL 中,一开始就已经按照编码分析提交内容,setCharacterEncoding()自然就无效。
2.需要注意的是,这种方式对URL传参这种JSP请求是没有作用的。比如:
url test request(zh)
这种情况仍然会出现乱码,这种 URL 传参的方式,只能修改服务器 tomcat 的传输编码 格式。修改 tomcat 安装文件 apache-tomcat-8.5.20\conf 目录下的 server.xml添加 URIEncoding=“UTF-8” ,就可以处理 URL 传递参数造成的中文乱码问题了。
response 输出页面元素内容时,也会出现乱码。
使用下面代码就可以设置 response 输出的编码格式:
response.setCharacterEncoding();
response.setContentType(“text/html;charset=utf-8”);
response.setCharacterEncoding()作用:
作用:指定对服务器响应进行重新编码的编码。服务器在将数据发送到浏览器前,对数 据进行重新编码时,使用的就是该编码。
服务器获取客户端传递过来的数据出现乱码的问题(即使用 get 获取 post 向服务器发送请 求时出现乱码):
1.post请求乱码处理:
用户在表单中填写的内容在 http 体中被提交给 Servlet。当我们在表单中输入中文时,servlet 的 request 的编码与客户端不一致,则服务器无法解析,则会出现乱码。 解决方法是改变 http 请求体中的字符编码(对于 get 无效,因为 get 提交在请求头中)改变 http 请求体中的字符编码为 UTF8 : request.setCharacterEncoding(“UTF-8”);
2.get请求乱码处理
1)URL的参数没有使用编码(即使用了ISO-8859-1等),则在服务器端获取get的参数的时候使用String一个可以指定编码的构造函数。
String username = request.getParameter(“username”);
String resultName = new String(username.getBytes(“ISO-8859-1”),“utf-8”);
2)有时提交的一些信息在地址栏显示的是“%2C%C6%CC%C6”的字样,其实这就是 对 URL 进行了如下的编码。
java 有两个类用来修改编码:
进行编码:URLEncoder.encode(String s, “UTF-8”)
进行解码:URLDecoder.decode(String s, “UTF-8”);
这样就可以得到传递过来的中文参数了,许多网站用的都是这种方式解决中参数的。
使用这个类把 URL 修改为:
http://127.0.0.1:8080/test?username=<%=URLEncoder.encode("乱码文字 ",“UTF8”)%>
这样服务器获取 username 这个参数使用:
String username = URLDecoder.decode(request.getParameter(“username”),“UTF8”);