009_Get请求中文乱码
一. 创建一个GBK编码的html文件, 发送get请求
1. 新建一个GetLuanMa的Web工程
2. 新建一个getGBK.html文件
3. 更改getGBK.html编码为GBK
4. 编写getGBK.html
<!DOCTYPE html> <html><head><meta charset="GBK" /><title>get请求中午乱码处理</title></head><body><form action="GLMGBK.action" method="get">用户名:<input type="text" name="username" /><br />密码:<input type="password" name="password" /><br /> <input type="submit" value="登录"></form></body> </html>5. 新建一个GetLuanMaGBK.java类
6. 编写GetLuanMaGBK.java
package com.lywgames.myservlet;import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class GetLuanMaGBK extends HttpServlet {private static final long serialVersionUID = 1L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");System.out.println("username = " + username + " password = " + password);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }7. 编写web.xml
8. 部署运行, 访问getGBK.html
9. 点击登录按钮, 控制台打印
二. 创建一个UTF-8编码的html文件, 发送get请求
1. 新建一个getUTF8.html
2. 编辑getUTF8.html
<!DOCTYPE html> <html><head><meta charset="UTF-8" /><title>get请求中午乱码处理</title></head><body><form action="GLMUTF8.action" method="get">用户名:<input type="text" name="username" /><br />密码:<input type="password" name="password" /><br /> <input type="submit" value="登录"></form></body> </html>3. 新建GetLuanMaUTF8.java类
4. 编辑GetLuanMaUTF8.java
package com.lywgames.myservlet;import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class GetLuanMaUTF8 extends HttpServlet {private static final long serialVersionUID = 1L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");System.out.println("username = " + username + " password = " + password);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }5. 编辑web.xml
6. 部署运行, 访问getUTF-8.html
7. 点击登录按钮, 控制台打印
三. 分析以上编码为GBK和UTF-8的网页发送的请求
1. 浏览器会对请求的URL中非ASCII码字符进行编码。
1.1. 编码为GBK的网页(告诉浏览器用GBK编码解析网页)
1.2. 编码为GBK的网页, 发送请求, 浏览器地址栏的信息如下:
http://localhost:8080/GetPostLuanMa/GLMGBK.action?username=%B5%C4%B5%C4%C8%B7%C8%B7&password=111
1.3. 在GBK的网页中, 用户名"的的确确", 在经过GBK编码后变成了%B5%C4%B5%C4%C8%B7%C8%B7。
1.4. 编码为UTF-8的网页(告诉浏览器用UTF-8编码解析网页)
1.5. 编码为UTF-8的网页, 发送请求, 浏览器地址栏的信息如下:
http://localhost:8080/GetPostLuanMa/GLMUTF8.action?username=%E7%9A%84%E7%9A%84%E7%A1%AE%E7%A1%AE&password=111
1.6. 在UTF-8的网页中, 用户名"的的确确", 在经过UTF-8编码后变成了%E7%9A%84%E7%9A%84%E7%A1%AE%E7%A1%AE。
2. 新建一个URLEncoderDecoder1.java类, 对"的的确确"进行GBK和UTF-8的URLEncoder.encode和URLDecoder.decode, 观察是不是浏览器对"的的确确"进行GBK和UTF-8编码。
2.1. 新建一个URLEncoderDecoder1.java类
2.2. 编写URLEncoderDecoder1.java类
package com.lywgames.myservlet;import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder;public class URLEncoderDecoder1 {public static void main(String[] args) {try {// URLEncoder.encode("的的确确", "utf-8") ==> %E7%9A%84%E7%9A%84%E7%A1%AE%E7%A1%AE System.out.println(URLEncoder.encode("的的确确", "utf-8"));System.out.println(URLDecoder.decode("%E7%9A%84%E7%9A%84%E7%A1%AE%E7%A1%AE", "utf-8"));// URLEncoder.encode("的的确确", "gbk") ==> %B5%C4%B5%C4%C8%B7%C8%B7System.out.println(URLEncoder.encode("的的确确", "gbk"));System.out.println(URLDecoder.decode("%B5%C4%B5%C4%C8%B7%C8%B7", "gbk"));} catch (UnsupportedEncodingException e) {e.printStackTrace();}} }2.3. 运行程序
四. 解决get请求的中午乱码
1. tomcat收到客户端的数据后, 默认使用ISO-8859-1去解码。
2. 服务器在接收到浏览器经过UTF-8编码后的数据, 进行一次ISO-8859-1解码, 打印出来的数据为: çç确确。
3. 服务器在接收到浏览器经过GBK编码后的数据, 进行一次ISO-8859-1解码, 打印出来的数据为: µÄµÄÈ·È·。
4. 编写URLEncoderDecoder2.java类, 对%B5%C4%B5%C4%C8%B7%C8%B7和%E7%9A%84%E7%9A%84%E7%A1%AE%E7%A1%AE, 进行ISO-8859-1的URLDecoder.decode解码。查看控制台的输出信息和Servlet请求时的信息是否一致。
4.1. 新建URLEncoderDecoder2.java类
4.2. 编写URLEncoderDecoder2.java类
package com.lywgames.myservlet;import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder;public class URLEncoderDecoder2 {public static void main(String[] args) {try {// URLEncoder.encode("的的确确", "utf-8") ==> %E7%9A%84%E7%9A%84%E7%A1%AE%E7%A1%AE// URLDecoder.decode("%E7%9A%84%E7%9A%84%E7%A1%AE%E7%A1%AE", "ISO-8859-1") ==> çç确确System.out.println(URLEncoder.encode("的的确确", "utf-8"));System.out.println(URLDecoder.decode("%E7%9A%84%E7%9A%84%E7%A1%AE%E7%A1%AE", "ISO-8859-1"));// URLEncoder.encode("的的确确", "gbk") ==> %B5%C4%B5%C4%C8%B7%C8%B7// URLDecoder.decode("%B5%C4%B5%C4%C8%B7%C8%B7", "ISO-8859-1") ==> µÄµÄÈ·È·"System.out.println(URLEncoder.encode("的的确确", "gbk"));System.out.println(URLDecoder.decode("%B5%C4%B5%C4%C8%B7%C8%B7", "ISO-8859-1"));} catch (UnsupportedEncodingException e) {e.printStackTrace();}} }4.3. 运行程序
5. 使用new String("数据信息".getBytes("ISO-8859-1"), "utf-8"), 把"数据信息"打散到ISO-8859-1对应的字节数组 , 然后再按utf-8组拼字符串, 解决乱码问题。
5.1. 新建一个URLEncoderDecoder3.java类
5.2. 编写URLEncoderDecoder3.java
package com.lywgames.myservlet;import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder;public class URLEncoderDecoder3 {public static void main(String[] args) {try {// URLEncoder.encode("的的确确", "utf-8") ==> %E7%9A%84%E7%9A%84%E7%A1%AE%E7%A1%AE// URLDecoder.decode("%E7%9A%84%E7%9A%84%E7%A1%AE%E7%A1%AE", "ISO-8859-1") ==> çç确确System.out.println(URLEncoder.encode("的的确确", "utf-8"));System.out.println(URLDecoder.decode("%E7%9A%84%E7%9A%84%E7%A1%AE%E7%A1%AE", "ISO-8859-1"));// 把çç确确打散到ISO-8859-1对应的字节数组 , 然后再按utf-8组拼字符串System.out.println(new String("çç确确".getBytes("ISO-8859-1"), "utf-8"));// URLEncoder.encode("的的确确", "gbk") ==> %B5%C4%B5%C4%C8%B7%C8%B7// URLDecoder.decode("%B5%C4%B5%C4%C8%B7%C8%B7", "ISO-8859-1") ==> µÄµÄÈ·È·"System.out.println(URLEncoder.encode("的的确确", "gbk"));System.out.println(URLDecoder.decode("%B5%C4%B5%C4%C8%B7%C8%B7", "ISO-8859-1"));// 把µÄµÄÈ·È·打散到ISO-8859-1对应的字节数组 , 然后再按gbk组拼字符串System.out.println(new String("µÄµÄÈ·È·".getBytes("ISO-8859-1"), "gbk"));} catch (UnsupportedEncodingException e) {e.printStackTrace();}} }5.3. 运行程序
6. 修改Servlet解决乱码问题
6.1. 修改GetLuanMaGBK.java
6.2. 修改GetLuanMaUTF8.java
7. 还有一种比较简单的解决get请求乱码的方法, 就是在tomcat里面做设置处理 conf/server.xml 加上URIEncoding="utf-8"
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
总结
以上是生活随笔为你收集整理的009_Get请求中文乱码的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 008_HttpServletReque
- 下一篇: 010_Post请求中文乱码