欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

009_Get请求中文乱码

发布时间:2025/4/17 编程问答 35 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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请求中文乱码的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。