utf8编码
关于编码问题:
首先需要知道什么是编码为什么要编码, 计算机只能存储一个字节一个字节的二进制信息,所以需要把人可读的这些文字用唯一的方式在计算机内部表示出来, 但是表示的方法不唯一;
例如英文字符 就那么点 所以一个字节 也就是 8个二进制位就能给所有的进行编码,最多能给256个符号编码; 但是ASCII 编码实际只使用了 7位 所以最多编码 128个字符。
但是汉字就不行了, 常用的汉字大概6000多个, 所以 至少需要两个字节, 所以中国government给出了两个字节的编码方案, 叫做GBxxxx (国标的意思)
两个字节16位 最多 有65536 个字符, 所以 给这些汉字用是足够了,但是有个问题 如何让GB码和ASCII码互相兼容, 即这65536 个字符里面关于那些英文字符的编码 在GB码和ASCII码中要一致
方法很简单 要求所有最高位为0的编码表示的是ASCII码, 最高位为1的编码是GB码;
这样实际最多就只能表示32768个汉字了;
但是GB国标码只能在中国用, 世界人民怎么办呢?世界有那么多的语言,每种语言都应该有编码 所以有了一个叫做unicode 统一编码的东西出现了;Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode用数字0-0x10FFFF来映射这些字符(见百度百科http://baike.baidu.com/view/40801.htm)
当然最后还有一个我们经常见到的UTF8编码, 这个是什么东西?
UTF全称 是Unicode Transformation Format 即unicode 编码的变形形式;
unicode编码是定长度的, 但是对于ASCII字符来讲 有点浪费了, 可以用一个字节表示 ASCII字符, 用多个字节表示 汉字什么的, 这就是变长度编码方式了, 那就需要对unicode编码进行一些变形;
UTF-8的定义:
0开头 latin字符
10开头 一个字符连续字节中的某一个
1111xxx 一个多字节字符的开始 前导1的个数表示字节个数 前导1后面紧跟一个0
汉字一般3个字节
unicode是统一编码
utf8是对unicode的转换编码
unicode utf8
0xxxxxxx -> 0xxxxxxx latin 转化成自身
00000yyy yyxxxxxx -> 110yyyyy 10xxxxxx 两字节 转化成 两字节
zzzzyyyy yyxxxxxx->1110zzzz 10yyyyyy 10xxxxxx 两字节转化成三字节(一般汉字就是如此)
000wwwzz zzzzyyyy yyxxxxxx -> 11110www 10zzzzzz 10yyyyyy 10xxxxxx 三字节转化成4字节