看了好久的文章,终于较为清楚编码问题了,下面是总结
1、中文编码常见的有:简体-->GB系列(GB2312,GB2312-80,GB10830);繁体-->BIG5;还有万国码UTF-8
2、UTF-8并不是编码规范,而是Unicode(===UCS,另一组相同的编码名称)的实现方式,还有UTF-16,UTF-32
3、Unicode最早定义了2个字节的编码(但这是数学问题,并没有规定存储和传输方式),共65535个符号,这就对应UTF-16(===UCS-2);但是这还不够,又发展出UTF-32(===UCS-4)来表示更多字符,但是UTF-16已经满足绝大多数需求,所以就以UTF-16为主,UTF-32稍加改造使用
4、UTF-16的缺点就是英文字符也是2字节编码,有很大浪费,所以使用UTF-8的格式来进行存储和传输
5、uxxxx就代笔是Unicode编码的字符
UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
参考:
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
http://javawolf.blog.163.com/blog/static/121613275200967111121659/