Unicode、UTF-8的理解

来源:互联网 发布:informix数据库 编辑:程序博客网 时间:2024/06/05 19:46
计算机只能处理数字,那么对于人类的语言最终怎么输入计算机并且使用计算机存储和传输呢?我们只能对每个字符进行数字编码,这就是各个字符集存在的意义,如果地球上只有英文一种语言那么ASCII编码就足够了,但是对于亚洲这些象形文字,不是使用字母逻辑的排列组合生成的文字进行数字编码就比较麻烦了,对于汉字常用字大概是七万左右,而简体加繁体汉字大概有六七万个,对于ASCII编码只有一个字节的长度显然是不够的,所以为表示世界上大部分语言有过很多种字符集,字符集的不唯一这也是导致乱码的原因,可以想象如果世界上就一种字符集涵盖世界上人类语言的所有字符,那么乱码问题就会消除了,这就是Unicode字符集出现的原因,Unicode是很大的字符集,预计可以容纳100万个字符,比如“我”字对应“\u6211”,字母“A”对应“\u0041”。但是Unicode只是一个字符集,想象一下当你有一个文本文件,内部有各种字符,如果全部使用Unicode字符集的编码表示,内部会是什么样的呢?因为在Unicode字符集中比如“A”只需要占用一个字节就可以表示,而“我”字则需要两个字节表示,还有其他的语言有的会用三个字节四个字节。如果这些二进制混在一起我们是没办法分辨出来哪几个字节代表一个字符的,我们当然可以让所有字符都占用4个字节,这样每四个字节就是一个字符是可以表示的,但是有一个很大的问题就是会导致文件很大占用过多的存储空间,所以就出现了变长的utf-8编码。
utf-8的原理:
1.对于单字节的字符,则第一位为0,后面7位为Unicode的码,因此对于英文字符的ASSCII码和Unicode码是相同的。
2.对于n字节(n>1),第一个字节的前n位都为1,第n+1位全部为0,后面字节的前两位全部为10,剩下的没有被占用的位全部为这个字符的Unicode码。
下图选自http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html



接下来以“我”为例:
“我”的Unicode码为0x6211属于第三行,占用三个字节,则UTF-8编码为
11100110 10001000 10010001,以上就是UTF-8的原理。
0 0
原创粉丝点击