最近遇到一些字符转换的问题,稍稍总结一下自己的理解,也希望能给在这方面同样不了解的同学有所启发。如果过有错,希望你能毫不吝啬的指出 :)
常说的ascii、gb2312、ansi和unicode等等是字符集也称内码,在字符集中每个字符都一个编号,叫做编码。ansi并不是一个具体的字符集,可以说是一个字符集的集合,比如ascII和gb2312。ascII定义包括英文字母和数字在内的1-128个字符,用1个字节表示。大于128则用双字节表示一个字符,128之后的字符集与系统的语言相关,如简体中文的就是gb2312,繁体中文则是big5,各个地区之间的编码不相同,所以也不兼容,这就是为什么以前很多软件在不同语言的系统中会出现乱码的原因了。
为了解决这个问题unicode出现了,unicode将数十种常用语言进行统一编码,每个字符有了唯一的编码。unicode有多个版本,常用的是UCS-2,即使用2个字节来保存。usc-2又因为高字节和低字节的前后顺序分为big endian 和little endian,big endian 即高字节在前,低字节在后,在文本的开头以标记位:FF FE 表示,little endian则反之。或许有人要问了,utf-8呢?utf-8并不是字符集,只是unicode的一种表现形式,所有的utf-8都是通过unicode编码换算而来。
现在对于编码有了比较清楚的个人认识,下面说说utf-8如何由unicode换算而来。
首先,utf-8是变长的,是由1-4个字节来表示一个字符,对于英文和数字(即小于128的)则用一个字符表示0xxx xxxx
128之后的则根据字符的编号所在范围来决定到底使用几个字节来表示。范围如下:
00000000 - 0000007F: 0xxxxxxx
00000080 - 000007FF: 110xxxxx 10xxxxxx
00000800 - 0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
00010000 - 001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
00200000 - 03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
04000000 - 7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
比如“其”的unicode编码查表得知为:H5176,处于第三行00000800 - 0000FFFF的范围内,则形式为 1110xxxx 10xxxxxx 10xxxxxx。
这些xxx的地方到底是什么呢?这里就是“其”的unicode码了,H5176二进制为01010001 01110110,拆开对应:
---------------------------------------------
1110XXXX 10XXXXXX 10XXXXXX
0101 000101 110110:
---------------------------------------------
得到:
11100101 10000101 10110110
十六进制为:E5 85 B6,这个就是“其”的utf-8编码了。反过来呢?会了么? :)
到这里,你在浏览网页的时候发现http://xxx.xxx.com/path/page?name=%E5%85%B6 就知道是什么意思了吧?
就到这吧,我也理解到这而已,呵呵,有错误还请多多指教了
好了,该睡觉了,呼嗒呼塔 Zzz....