request.setCharacterEncoding("utf-8");//改变了tomcat 的默认
表示tomcat使用UTF-8的方式解码浏览器传过来的utf8字节码
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
表示用UTF-8显示中文,同时浏览器也会使用UTF-8编码提交中文,
这句话的目的是告诉浏览器,等下发消息给服务器的时候,使用UTF-8编码,变成字节码给tomcat
这句话加上去以后,浏览器把输入的参数编码成utf-8的字节发送给了tomcat
tomcat对于post提交的数据默认的编码方式是ISO-8859-1,也就是它用ISO-8859-1解析了utf-8编码之后的字节。
String name=request.getParameter(“username”);
这里传递给name的就是被错误解码之后的乱码。
但是由于ISO-8859-1是单字节编码。
所以byte[] bytes= name.getBytes(“ISO-8859-1”);进行重新编码可以得到没有被tomcat解析过的utf8字节串。
然后再用utf-8解码就能得到本来的数据了。
要了解如下几点,才能理解透彻
- 编码 和 解码 是什么,用utf-8来举例:
阿伦 →阿伦
由左到右的过程,叫编码
阿伦 ←阿伦
由右到左的过程,叫解码
2.编码和解码的方式必须一样才能避免出现乱码
假如你用utf-8编码,却用gbk来解码,那显示出来就会是乱码
3.tomcat接收到字符码之后,会直接采用ISO-8859-1方式进行解码(这是它的默认机制)
例如:
用户输入“阿伦”,浏览器采用utf-8将其编码为 阿伦
然后发给tomcat
tomcat理应用同样的utf-8来解码,但它不管不顾,依旧采用自己ISO的方式来解码,
比如解码成了 ^-^
然后显示出来, 这就是所谓的乱码。
程序员的解决办法就是先用tomcat的ISO方式再将 ^-^
编码,恢复成 阿伦
然后再用浏览器的utf-8方式将 阿伦 解码, 就成功得到了 “阿伦”
整个流程: “阿伦” → 阿伦
→ ^-^
→ 阿伦
→ 阿伦
返回中文的响应:
Get限制Form表单的数据集的值必须为ASCII字符(也就是说不能有中文);而Post支持整个ISO10646字符集。默认是用ISO-8859-1编码