关于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) ,还有 “.”  ,”-” ,”*” ,”_”   ,除了这几个字符以外,其它的字符必须进行URL编码,规则如下:

·将空格转换为(+)
·对0-9,a-z,A-Z之间的字符保持不变。
·对于所有其他的字符,用这个字符的当前字符集编码在内存中的十六进制格式表示,并在每个十六进制字节前加上一个百分号%。

   字符在计算机内存中其实就是一个数值,URL编码并不对字符进行编码,而是对代表这个字符的数值进行编码,这个数值具体是多少,就要看字符当前使用的字符集编码了。对于中文来说,存在多种字符集编码,同一个字符在不同的字符集编码下对应不同的数字。比如:在GBK编码集中,“中”对应的数字的16进制表示是: 0xD6D0(最前面的是零X表示16进制数),两个字节。UTF-8字符集编码中,”中”对应的数字的16进制表示是:0xE4B8AD,占3个字节.。我们所看到的“中”只是一个图形而已,是计算机按照编码集中数字所对应的图形来显示文字的。对于计算机来说,当它看到内存中对应某个字符的数字时,它能否知道这个数字对应的到底是那个字符(图形),这就需要告诉计算机编码集了。如果本来是GBK编码集,计算机却把它当成UTF-8来处理,这样就产生到了乱码了。

 所以对要提交到web服务器的数据进行URL编码的时候,必须要指定这些数据的编码集,那么计算机如何来进行URL编码,下面举例说明:
 以字符串”abc 中”为例:

“abc ” 的编码集是GBK “abc ” 的编码集是UTF-8
abc保持不变,空格转换成”+”,

”GBK编码是: 0xD6D0

所以最终的结果是:

abc+%D6%D0

abc保持不变,空格转换成”+”,

”UTF-8编码是: 0xE4B8AD

所以最终的结果是:

abc+%E4%B8%AD

 

        Java中提供了一个类(java.net.URLEncoder)专门用来做URL编码,第一个参数是需要编码的字符串,第二个参数是指定的字符集:

        String urlEncode=URLEncoder.encode(“abc 中”,”UTF-8″);

那么浏览器如何进行URL编码呢?不同的浏览器处理的方式不一样,通常浏览器会用两种编码方式发送URL到服务器,分别是UTF-8和ANSI(当前系统语言设置,在简体中文windows系统中就是GBK编码)下面分别来分析:
从客户端往服务器提交数据有常用两种方式GET和POST.
情况一: 直接在地址栏输入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
     中文Windows环境下,IE中默认发送的URL的PATH部分是UTF-8编码,参数部分是GBK编码。IE的设置选项中有一项是“总是以 UTF-8 发送URL”可以改变发送URL的编码为ANSI。

2. FireFox

  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
 

    中文Windows环境下FireFox中默认发送的URL的PATH和参数都是GBK编码,在FireFox地址栏输入“about:config”,找到选项“network.standard-url.encode-utf8”,即可改变发送URL的编码方式。

3. Opera 

 PATH部分参数部分
UTF-8模式(默认)%E4%B8%AD%E5%9B%BD.jspkw=%E4%B8%AD%E5%9B%BD
 UTF-8编码、urlencodeUTF-8编码、urlencode
**情况二: 点击网页中的连接以后**

在不同的浏览器中打开不同编码的网页中的链接,特性也不相同。在不改变浏览器默认选项情况下访问不同编码的网页中以下链接: