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;

	@Override
	protected 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);
	}
	
	@Override
	protected 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;

	@Override
	protected 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);
	}
	
	@Override
	protected 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%B7
			System.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"/>

### Unity GET 请求中的中文乱码解决方案 在处理 Unity 中的 GET 请求时,可能会遇到由于 URL 参数编码不一致而导致的中文乱码问题。为了有效解决这一问题,可以采取以下措施: 1. **确保统一的字符编码** 对于 GET 请求而言,参数通常附加在 URL 后面作为查询字符串的一部分。因此,在发送请求前应当对这些参数进行适当编码,特别是当它们包含非 ASCII 字符(如汉字)。推荐的做法是在构建 URL 时采用 UTF-8 编码来转换所有的特殊字符和多字节字符[^2]。 2. **使用 `WWWForm` 或者 `UnityWebRequest` 进行编码** 当利用 Unity 的内置网络库发起 HTTP 请求时,可以选择合适的 API 来帮助自动完成必要的转义操作。例如,`WWWForm` 类能够方便地创建 POST 表单数据并对其进行正确编码;而对于 GET 方法,则可以通过手动拼接已编码过的键值对或将整个路径传给 `UnityWebRequest.Get()` 函数实现相同效果[^4]。 3. **服务器端配置支持 UTF-8** 即使客户端已经做了充分准备,但如果服务端未能识别或适当地解释收到的数据流,仍然可能出现乱码现象。所以还需要确认 Web 应用程序本身也启用了相应的国际化设置,比如 Java Servlet 容器可通过安装特定过滤器强制所有输入输出都遵循指定编码标准[^1]。 ```csharp using UnityEngine; using System.Collections; public class GetRequestExample : MonoBehaviour { void Start() { StartCoroutine(GetData()); } IEnumerator GetData(){ string url = "http://example.com/api?name=" + WWW.EscapeURL("你好世界", WWW.FormUrlEncoding); using (var www = new WWW(url)) { // 使用 WWW 而不是 UnityWebRequest 是因为更简单直观 yield return www; if(string.IsNullOrEmpty(www.error)){ Debug.Log("Received: "+www.text); }else{ Debug.LogError("Error downloading: "+www.error); } } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值