解决 Get 和 Post 和客户端,get请求URL传中文参数等乱码问题(超详细)
解决 Get 和 Post 和客户端,get请求URL传中文参数等乱码问题
说来说去还是先写一些最基本又是最常见的疑难杂症,针对于基础薄弱的同学,这些东西还是需要注意的,以后写接口,封装工具,文件上传下载等过程中,发布到服务器上出现类似的中文乱码问题,都是一些小问题但是有时容易忽略的问题。今天就提出来单独说说。
废话不多说,直接开始。
一. get方式的请求中文乱码
在一般的web开发过程中,提交方式有get、post最为常用。
针对于get方式出现中文乱码,
1.get请求实例
- 前台发出get请求:
比如html/jsp等前台发送一个get请求的表单数据:不管你是form提交还是ajax提交,反正只要是get请求。
<form action="UploadServlet" method="get" >
用户名:<input name="username" type="text" /><br/>
密 码:<input name="password" type="password" /><br/>
<input type="submit" />
</form>
- 后台获取表单内容代码:
String username =request.getParameter("username") ;
String password =request.getParameter("password");
System.out.println("---get:"+username+" "+password);
图:
- 控制台打印乱码内容:
不管是???类型是乱码,还是caerdsada之类的乱码,反正就是你确定中文乱码了。
图:
2.get方式乱码分析:
发送get请求的时候,首先页面会进行UTF-8编码,然后传送的时候http又对页面进行ISO-8859-1编码,而传输中实际上还有一个针对于url的编码。
然后服务器拿到数据以后,首先会针对于url编码自动解码,但是http中的ISO-8859-1没进行解码,还有页面的utf8也没有解码。所以出现乱码现象。
总之get请求,经历过三次编码—页面的声明编码,https传送编码,url编码。而其中,url的编码服务器是会自动解码的。(URL是针对那种get请求后面携带中文参数发给服务器,比如下载功能、预览功能。)
get参数发送的时候,http进行传输编码图:
get请求的URL携带中文参数的编码分析(文件下载):
还有一个针对于表单get请求形式的编码分析:
总而言之,就是需要对get请求在后台做两次解码处理,也就是把得到的乱码按照原来乱码的步骤逆序操作。
3. 解决get乱码的两种方式:
对get请求在后台做两次解码处理:
1、先以iso-8895-1进行解码
2、然后再以utf-8进行解码
第一种:
使用URLEncoder 和 URLDecoder 两个类 编解码。
比如:
//获取客户端传递过来的用户名参数值
String username = request.getParameter("username");
System.out.println("用户名:" + username);
// 先对用户名进行解码得到%E7%8E%8B%E6%8C%AF%E5%9B%BD 这样的形式
username = URLEncoder.encode(username, "ISO-8859-1");
// 再进行utf-8编码 一次得到页面上输入的文本内容
username = URLDecoder.decode(username, "UTF-8");
System.out.println("乱码解决后用户名:" + username);
第二种:
使用 String类的方法进行两次编解码。
比如:
String username = request.getParameter("username");
username = new String(username.getBytes("ISO-8859-1"), "UTF-8");
System.out.println("乱码解决后用户名:" + username);
图示:
另外:
针对于get请求中,URL携带中文参数后台接收乱码的解决。
这是针对于比如文件下载等功能经常出现的。
现在需求是在浏览器里面直接发请求,浏览器发请求,默认发的是get请求,然后带参数,参数包含中文汉字。麻烦就在这里,参数里面的汉字,在后台接收的时候,是乱码。
比如:下载某个文件。
或者是这样的:
这个就是简单的在URL里面带中文汉字参数,然后,就在后台乱码。
解决:
filePath = new String(filePath.getBytes("ISO-8859-1"), "utf-8");
但是,要出现坑,关于特殊字符,虽然也是经过了2次解码,但是,到后台之后,发现,还是出现了部分偏差。
这种情况:
在自己的tomcat安装目录的下的\conf下,修改tomcat的配置文件server.xml:
需增加 URIEncoding=“UTF-8” 这一句,然后重启tomcat即可。
<connector port="8080" protocol="HTTP/1.1" connectiontimeout="20000" redirectport="8443" uriencoding="UTF-8">
connector>
最后还是推荐传参使用英文或者字符串,中文还是少用。
二.POST请求中文参数值乱码
针对于post请求的乱码就轻松得多,总所周知,数据存储在请求体里面,不需要在编码了,而是字节流形式存储。
前台页面请求采用post请求。
2.乱码原因分析:
因为post是以二进制流的形式发送到的服务器。
服务器收到数据后,默认以iso-8859-1进行编码。
3.post乱码解决:
首先要在jsp/html页面声明utf8编码:
然后告诉服务器在获取请求参数之前以utf-8来解码即可。
request.setCharacterEncoding(“UTF-8”); 方法设置字符集即可。
这样post就完成对应解码,也就中文不会出现乱码了。
三、后台输出中文到前台浏览器端的乱码
上面都是说的从客户端-也就是浏览器前台发送请求给服务器后台导致的乱码情况。下面说说反过来,由后台发送给前台的中文乱码情况。
1.输出字符串内容到客户端
后台往客户端输出,一般分两个步骤:
第一步:先获取输出流(二进制返回用获取字节流,字符出获取字符流)
第二步:调用输出流对象,写出数据第客户端。
比如后台这么写:
// 通过response响应对象获取到字符输出流
Writer writer = response.getWriter();
// 往 客户 端 输出数据。
writer.write("this is response content!");
// 输出中文数据到客户端
writer.write("这是中文的输出");
通过浏览器访问后显示的结果:
2.乱码原因分析:
主要是因为服务器输出的字符串的编码和客户端显示字符串的编码不一致。导致乱码问题。
所以我们只需要设置服务器和客户端的编码相同就可以解决这个问题。
3.乱码的解决:
设置服务器的字符串编码
//设置服务器输出的编码为UTF-8
response.setCharacterEncoding("UTF-8");
设置客户端的字符串显示编码。
//告诉浏览器输出的内容是html,并且以utf-8的编码来查看这个内容。
response.setContentType("text/html;charset=utf-8");
注意:这两行语句要在获取输出流之前执行。才会生效。
效果代码:
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//设置服务器输出的编码为UTF-8
response.setCharacterEncoding("UTF-8");
//告诉浏览器输出的内容是html,并且以utf-8的编码来查看这个内容。
response.setContentType("text/html; charset=utf-8");
// 通过response响应对象获取到字符输出流
Writer writer = response.getWriter();
// 往 客户 端 输出数据。
// writer.write("this is response content!");
// 输出中文数据到客户端
writer.write("这是中文的输出");
}
图示:
以上就是整个解决 Get 和 Post 和客户端,get请求URL传中文参数等乱码问题,不管是前台向后台请求,还是后台向前台反馈,不管是post、get、还是URL+get都可以通过上述的方式一一对应界面中文的乱码问题。 希望对大家有帮助。
You got a dream, you gotta protect it.
如果你有梦想的话,就要去捍卫它 。 ——《当幸福来敲门》