欢迎光临
一个有态度、有温度的分享型博客

难分难解的字符集ASCII、Unicode、UTF-8

闲来无事学习一下Python,在看到关于Python字符类型的时候有提到字符集,字符集的问题我一直没搞明白,ASCII、Unicode、UTF-8之间有什么区别呢?借着这个机会总算是有了一点点的明白,记录下来,学习一下。

谈到字符集的人,肯定是跟计算机打交道的人,由于计算机只能处理数字,没有人类这么超高的智慧,如果计算机需要处理文本,那就必须把文本转换成数字。那么问题来了:如何实现把文本转换成数字这个过程呢?聪明的人类想到了字符集。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),也就是说8位一个字节。所以,一个字节能表示的最大的整数就是255(2^8-1,二进制数字1111 1111 = 十进制 255),如果要表示更大的数字,就必须采用更多的字节,比如两个字节表示的最大整数是65535(2^16-1).

由于计算机诞生于美国,因此最初只是把大小写英文字母、数字和一些符号编码到计算机,这个编码就是ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。下面是ASCII编码表,^_^ :

ASCII编码表

但是问题又来了:要处理中文一个字节是不够的,至少需要两个字节,所以,中国制定了GB2312编码,用来把中文编进去。日本制定了Shift_JIS把日文编进去。。。,这么多的语言怎么办呢???处理不好肯定会乱码的啊。。。,在这种情况下,Unicode编码应运而生。Unicode编码把所有的语言都统一到一套编码里,这样就不会出现混乱了。

再看看ASCII编码和Unicode编码的区别:

ASCII编码是一个字节,而Unicode编码通常是两个字节;
比如:
字母A用ASCII编码是十进制的65,二进制的01000001
汉字已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101

A用Unicode编码只需要在ASCII编码的前面补0,得到A的Unicode编码是00000000 01000001

因此,如果统一用Unicode编码,解决了编码混乱的问题,但是,英文本来可以用一个字节就可以表示的,现在使用Unicode进行编码,比使用ASCII编码使用的存储空间多了一倍,使得字符在存储和传输上都不是很划算。

基于这种情况,可变长编码UTF-8编码出现了,UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,比如英文字母被编码成1个字节,汉字通常是3个字节,比较生僻的字符可能会被编码成4-6个字节,因此,当我们传输的文本中包含大量的英文字符,使用UTF-8进行编码能够节省不少空间。

编码比较

从表格中可以看出,ASCII编码可以被看成UTF-8编码的一部分,所以,很多只支持ASCII编码的软件在UTF-8编码下仍然可以运行。

关于编码经常出现的问题:
比如一个XML文件,当我们使用Windows自带的记事本打开后,在后台读取的时候就经常报错,以前在网上查到的原因是由于微软犯二的处理方式及字符编码导致。在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者传输的时候,就转换成UTF-8编码。

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址