Java中的编码与解码
1. 基本概念:
(1)字符集(Charset):是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等。
(2)字符编码(Character Encoding):就是一套自然语言的字符与二进制数之间的对应规则。
注:一套字符集必然至少有一套字符编码。
2. 常见的字符集与字符编码:
(1)ASCII字符集,ASCLL编码,英文。
(2)ISO-8859-1字符集,ISO-8859-1编码,拉丁,兼容ASCII。
(3)GBxxx系列, GB2312 —》 GBK—》GB18030,汉语,兼容ASCII。
(4)Unicode字符集 ,UTF8编码,兼容ASCII;UTF16编码;UTF32编码,全球通用。
3. 关于网络传输中的编码与解码:
原理:将数据转为字节,再转为16进制,单字节前加%
例: 传智播客 = %E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2 (utf-8)
JavaScript中:
*Global全局对象中的方法:
decodeURI() 解码某个编码的 URI。
decodeURIComponent() 解码一个编码的 URI 组件。 注意:包含更多符号。
encodeURI() 把字符串编码为 URI。
encodeURIComponent() 把字符串编码为 URI 组件。 注意:包含更多符号。
escape() 对字符串进行编码。 注意:不能使用于对 URI。
unescape() 对由 escape() 编码的字符串进行解码。 注意:不能使用于对 URI。
Java中:
Class URLEncoder类 同JS中的encodeURIComponent(),包含更多符号。
Class URLDecoder类 同JS中的decodeURIComponent(),包含更多符号。
4. tomcat中get与post请求中参数的编码与解码:
*使用过滤器:
(1)URIEncoding和useBodyEncodingForURI两个参数互斥。useBodyEncodingForURI主要是为了兼容老版本,尽量用URIEncoding。
(2)tomcat8之前,URL中参数的默认解码是ISO-8859-1,而tomcat8的默认解码为utf-8。
(3)在过滤器中使用 request.setCharacterEncoding() 只能用来处理 POST 请求,对 GET 则无效。
(4)tomcat乱码的终极解决办法:
tomcat8之前:设置URIEncoding + Post的过滤器 或者 设置useBodyEncodingForURI+Post过滤器。
tomcat8之后:只要设置一个Post过滤器就可以了,tomcat9跟tomcat8是一样的。
在tomcat7的conf/server.xml中的端口号处添加即可:
port=”8080” protocol=”HTTP/1.1”
connectionTimeout=”20000”
URIEncoding=”UTF-8”
redirectPort=”8443”
使用maven,则在tomcat的插件中设置:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.1</version>
<configuration>
<path>/wp</path>
<port>8080</port>
<uriEncoding>UTF-8</uriEncoding>
<url>http://localhost:8080/manager/html</url>
<server>tomcat6</server>或者tomcat7插件
</configuration>
</plugin>
* 不使用过滤器:
tomcat8及之后的版本:
对get请求已经解决了中方乱码的问题,post请求则需要设置编码规则。
//设置参数查询的编码
request.setCharacterEncoding("utf-8"); // 默认按照iso-8859-1 字节转字符解码
该方法只能对请求实体内容的数据编码起作用。POST提交的数据在实体内容中,所以该方法对POST方法有效!
GET方法的参数放在URI后面,所以对GET方式无效!!!