009_Get请求中文乱码
一. 創(chuàng)建一個(gè)GBK編碼的html文件, 發(fā)送get請求
1. 新建一個(gè)GetLuanMa的Web工程
2. 新建一個(gè)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. 新建一個(gè)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. 部署運(yùn)行, 訪問getGBK.html
9. 點(diǎn)擊登錄按鈕, 控制臺(tái)打印
二. 創(chuàng)建一個(gè)UTF-8編碼的html文件, 發(fā)送get請求
1. 新建一個(gè)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. 部署運(yùn)行, 訪問getUTF-8.html
7. 點(diǎn)擊登錄按鈕, 控制臺(tái)打印
三. 分析以上編碼為GBK和UTF-8的網(wǎng)頁發(fā)送的請求
1. 瀏覽器會(huì)對(duì)請求的URL中非ASCII碼字符進(jìn)行編碼。
1.1. 編碼為GBK的網(wǎng)頁(告訴瀏覽器用GBK編碼解析網(wǎng)頁)
1.2. 編碼為GBK的網(wǎng)頁, 發(fā)送請求, 瀏覽器地址欄的信息如下:
http://localhost:8080/GetPostLuanMa/GLMGBK.action?username=%B5%C4%B5%C4%C8%B7%C8%B7&password=111
1.3. 在GBK的網(wǎng)頁中, 用戶名"的的確確", 在經(jīng)過GBK編碼后變成了%B5%C4%B5%C4%C8%B7%C8%B7。
1.4. 編碼為UTF-8的網(wǎng)頁(告訴瀏覽器用UTF-8編碼解析網(wǎng)頁)
1.5. 編碼為UTF-8的網(wǎng)頁, 發(fā)送請求, 瀏覽器地址欄的信息如下:
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的網(wǎng)頁中, 用戶名"的的確確", 在經(jīng)過UTF-8編碼后變成了%E7%9A%84%E7%9A%84%E7%A1%AE%E7%A1%AE。
2. 新建一個(gè)URLEncoderDecoder1.java類, 對(duì)"的的確確"進(jìn)行GBK和UTF-8的URLEncoder.encode和URLDecoder.decode, 觀察是不是瀏覽器對(duì)"的的確確"進(jìn)行GBK和UTF-8編碼。
2.1. 新建一個(gè)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. 運(yùn)行程序
四. 解決get請求的中午亂碼
1. tomcat收到客戶端的數(shù)據(jù)后, 默認(rèn)使用ISO-8859-1去解碼。
2. 服務(wù)器在接收到瀏覽器經(jīng)過UTF-8編碼后的數(shù)據(jù), 進(jìn)行一次ISO-8859-1解碼, 打印出來的數(shù)據(jù)為: ????????。
3. 服務(wù)器在接收到瀏覽器經(jīng)過GBK編碼后的數(shù)據(jù), 進(jìn)行一次ISO-8859-1解碼, 打印出來的數(shù)據(jù)為: μ?μ?è·è·。
4. 編寫URLEncoderDecoder2.java類, 對(duì)%B5%C4%B5%C4%C8%B7%C8%B7和%E7%9A%84%E7%9A%84%E7%A1%AE%E7%A1%AE, 進(jìn)行ISO-8859-1的URLDecoder.decode解碼。查看控制臺(tái)的輸出信息和Servlet請求時(shí)的信息是否一致。
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. 運(yùn)行程序
5. 使用new String("數(shù)據(jù)信息".getBytes("ISO-8859-1"), "utf-8"), 把"數(shù)據(jù)信息"打散到ISO-8859-1對(duì)應(yīng)的字節(jié)數(shù)組 , 然后再按utf-8組拼字符串, 解決亂碼問題。
5.1. 新建一個(gè)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對(duì)應(yīng)的字節(jié)數(shù)組 , 然后再按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對(duì)應(yīng)的字節(jié)數(shù)組 , 然后再按gbk組拼字符串System.out.println(new String("μ?μ?è·è·".getBytes("ISO-8859-1"), "gbk"));} catch (UnsupportedEncodingException e) {e.printStackTrace();}} }5.3. 運(yùn)行程序
6. 修改Servlet解決亂碼問題
6.1. 修改GetLuanMaGBK.java
6.2. 修改GetLuanMaUTF8.java
7. 還有一種比較簡單的解決get請求亂碼的方法, 就是在tomcat里面做設(shè)置處理 conf/server.xml 加上URIEncoding="utf-8"
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
總結(jié)
以上是生活随笔為你收集整理的009_Get请求中文乱码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 008_HttpServletReque
- 下一篇: 010_Post请求中文乱码