关于URL中文编码的后台提交的修复
DogJay
2017-08-26
【后端技术】
465人已围观
测试代码:
``
package com.njsxit.code;
``
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
``
public class EncodeString {
``
public static void main(String[] args) {
``
String strs = "";
String strs1 = "";
String strs2 = "";
String strUtf8 = "我是好人,我是平民";
String str = "%E5%B9%B46%E6%9C%88%E4%B8%8A%E6%B5%B7%E5%9C%B0%E9%93%81%E6%9C%88%E5%BA%A6%E8%BF%90%E8%90%A5%E7%94%9F%E4%BA%A7%E6%83%85%E5%86%B5%E7%BB%BC%E5%90%88%E6%8A%A5%E5%91%8A";
try {
``
strs = URLDecoder.decode(str, "UTF-8");
strs1 = URLDecoder.decode(URLDecoder.decode(strUtf8, "GBK"),"UTF-8");
strs2 = URLEncoder.encode(strUtf8, "UTF-8");
System.out.println(strs1);
System.out.println(strUtf8.equals(new String(strUtf8.getBytes("UTF-8"))));
/*System.out.println(new String(URLDecoder.decode(str, "UTF-8").getBytes("UTF-8")));*/
String name = "丁杰";
new String("丁杰".getBytes(),"utf-8");
System.out.println(name);
``
} catch (UnsupportedEncodingException e) {
``
// TODO Auto-generated catch block
e.printStackTrace();
``
` }`````
}
```}`
``
``
最终解决方法:
原因分析:
- 客户端
HTTP协议规定浏览器向web服务器传递的参数信息中不能出现某些特殊字符,
而必须对这些字符进行URL编码后再传递。那么,哪些是特殊字符?
正常的字符是: 字母(a-z,A-Z),数字(0-9) ,还有 “.”
·将空格转换为(+)
·对0-9,a-z,A-Z之间的字符保持不变。
·对于所有其他的字符,用这个字符的当前字符集编码在内存中的十六进制格式表示,并在每个十六进制字节前加上一个百分号%。
“abc | “abc |
abc保持不变,空格转换成”+”,
“中”GBK编码是: 所以最终的结果是: abc+%D6%D0 | abc保持不变,空格转换成”+”,
“中”UTF-8编码是: 所以最终的结果是: abc+%E4%B8%AD |
那么浏览器如何进行URL编码呢?不同的浏览器处理的方式不一样,通常浏览器会用两种编码方式发送URL到服务器,分别是UTF-8和ANSI(当前系统语言设置,在简体中文windows系统中就是GBK编码)下面分别来分析:
情况一: 直接在地址栏输入URL
中文Windows环境下,假如直接在浏览器的地址栏输入URL:
http://localhost:8080:/myweb/中国.jsp?kw=中国
1.IE浏览器的处理方式
| PATH部分 | 参数部分 |
UTF-8(默认) | %E4%B8%AD%E5%9B%BD.jsp | kw=中国 |
| UTF-8编码、urlencode | GBK编码、无urlencode |
ANSI模式 | 中国.jsp | kw=中国 |
| GBK编码、无urlencode | GBK编码、无urlencode |
2.
| PATH部分 | 参数部分 |
UTF-8模式 | %E4%B8%AD%E5%9B%BD.jspl | kw=%E4%B8%AD%E5%9B%BD |
| UTF-8编码、urlencode | UTF-8编码、urlencode |
ANSI模式(默认) | %D6%D0%B9%FA.jsp | kw=%D6%D0%B9%FA |
| GBK编码、urlencode | GBK编码、urlencode |
3.
| PATH部分 | 参数部分 |
UTF-8模式(默认) | %E4%B8%AD%E5%9B%BD.jsp | kw=%E4%B8%AD%E5%9B%BD |
| UTF-8编码、urlencode | UTF-8编码、urlencode |
在不同的浏览器中打开不同编码的网页中的链接,特性也不相同。在不改变浏览器默认选项情况下访问不同编码的网页中以下链接: