Get乱码的个人理解

get产生的中文乱码是由于:

  get是实现将数据提交给数据库,会先对URL进行整理,URLEncoder,这个会对里面的0-9a-z不处理,对中文和其他文字对应处理下,中文会进行GBK编码处理,然后将这部分拼接成新的URL发送上去,对应tomcat的默认编码一般是iso8859-1,则会对这部分进行新的编码,这样服务器获得到的字节码是经服务器编码集编码之后的结果。找到服务器提交到的地址之后,这里就需要进行解码处理,提交的结构是=等号连接的,得到后部分之后,这是一串iso8859-1的编码文件。因此应该转成字节码,转成对应属于的编码。

另一个理解:或者是,这个编码是经过URLEncoder编码,对应的将符合不变要求的部分保留下来,将要修改的部分经客户端的application编码集编码;

可以看出来这时候乱码问题跟客户端是有一定关系的,因此编程的时候应该指明让客户端使用的编码;这里UTF-8和GBK就常常遇到这个问题,google浏览器使用的UTF-8编码,而IE常常是自己判断编码,中文默认就是GBK,这样后台将其先从iso8859-1转回来之后,就需要知道浏览器客户端在提交给服务器之前是使用的什么编码解析的。

因此很多网站会先将对应的中文转成对应的编码集,这样服务器端接受的时候就知道

一般网站会先通过javascript完成UrlEncoder操作,转换成那些不会让浏览器再处理的字符,UrlEncoder的结果就是类似%C3%BC%40的样子,这样客户端浏览器就不会再处理,网站的javascript在进行这个操作的时候是指定的有编码类型,服务器端再对这个结果进行处理;

例子:

String ee1 = URLEncoder.encode("你好", "UTF-8");
System.out.println("EE:"+ee1);
String ee2 = URLDecoder.decode(ee1, "UTF-8");
System.out.println("EE@:"+ee2);

这样网站就可以无限制的使用get提交;

解决办法:http://yekui.iteye.com/blog/1029778 

 JDK对URLEncoder的解释:

java.net
类 URLEncoder

java.lang.Object
  

继承者

java.net.URLEncoder

public class URLEncoderextends Object

HTML 格式编码的实用工具类。该类包含了将 String 转换为 application/x-www-form-urlencoded MIME 格式的静态方法。有关 HTML 格式编码的更多信息,请参阅 HTML 规范

对 String 编码时,使用以下规则:

  • 字母数字字符 "a" 到 "z"、"A" 到 "Z" 和 "0" 到 "9" 保持不变。
  • 特殊字符 "."、"-"、"*" 和 "_" 保持不变。
  • 空格字符 " " 转换为一个加号 "+"。
  • 所有其他字符都是不安全的,因此首先使用一些编码机制将它们转换为一个或多个字节。然后每个字节用一个包含 3 个字符的字符串 "%xy" 表示,其中 xy 为该字节的两位十六进制表示形式。推荐的编码机制是 UTF-8。但是,出于兼容性考虑,如果未指定一种编码,则使用相应平台的默认编码。

例如,使用 UTF-8 编码机制,字符串 "The string ü@foo-bar" 将转换为 "The+string+%C3%BC%40foo-bar",因为在 UTF-8 中,字符 ü 编码为两个字节,C3 (十六进制)和 BC (十六进制),字符 @ 编码为一个字节 40 (十六进制)。

原文地址:https://www.cnblogs.com/yys369/p/3032845.html