通过对比ASCII编码来理解Unicode编码
Unicode是个规范,可以理解为一个索引表,世界上所有字符基本上在这个索引表中都能找到唯一一个数码与之对应,就像ASCII码表一样,也是一个规范,也可以看成是一个索引表,所有的英文字符都可以在这个索引表中找到唯一一个数码与之对应。
在ASCII码表中,'\x61'对应的是字母'a',\x表示告诉计算机以十六进制方式在ASCII表中找到第61(对应10进制的97)个字符,那么'\u'就是告诉计算机以Unicode的格式在Unicode表中找到相应的字符,比如'\u4e2d'就是告诉计算机在Unicode表中找到第4e2d(十六进制)个字符(计算机中肯定是保存了这个Unicode表的,不然上哪去查),也就是“中”这个字符。
对应到python代码:
至于utf-8或utf-16等等是Unicode这个规范的具体实现,比如“中”这个字,如果采用utf-8编码,那么在将“中”保存在文件中的时候,其实写入文件中的是\xe4\xb8\xad(即16进制的e4,b8,ad),而不是“中”对应的Unicode码(即4e2d)。
那么为什么不直接用Unicode码来表示Unicode字符本身,就像ASCII码直接就用来表示ASCII字符那样?
因为ASCII码对应的就那么一百来个字符,一个字节就能搞定了,但是Unicode规范收录的是全世界的字符,是一个相当庞大的集合,如果统一用Unicode码来表示每个字符,那么每个字符需要占用四个字节才能行,这样的话,对于像“中”这样的明明可以用两个字节就能表示的字符,为了统一,也必须占用4个字节才行,这样就浪费了大量的空间。
那么如果不统一占用四个字节,而是占多少就分配多少空间呢,比如“中”就占两个字节就行了,那就给它分配两个字节空间?这样的话,计算机就没法识别字符编码的边界了,比如“中”,你如果不告诉计算机它占用两个字节,计算机怎么会知道读两个字节就是“中”的编码边界。
所以为了解决空间浪费问题和计算机如何识别具体字符的编码的边界问题,就需要用不同的编码方式去实现Unicode规范,所以就有了utf8,utf16等编码方式。
阮一峰的博客可以参考一下:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html