ascii编码,Unicode和UTF-8之间的关系
1,ascii编码,这是一种单字节编码,8位,一个char的长度。最多可以存放255中不同的字符。对于早期的计算机系统来说,对于应付英文字符和一些符号绰绰有余了。 事实上基本的ascii码只用了128个。
2,Unicode编码。推出这种编码实属无奈。因为全世界人民都要使用计算机了,各种语言文字全都需要编码表示。各种象形文字,如汉字,日语,汉语,阿拉伯语等等。单单我们使用的汉字就能够贡献几万个基础字符。所以字符编码必须增加长度。一开始觉得那就改成双字符吧。 双字符,2位char。可以表示65536个不同的字符。但是,计算机科学家还是低估了人类的字符数量。仅汉字就将近十万个 -_-。
无奈,只好继续扩展Unicode的编码长度。增加到4个字节。一共可以表示4亿多个不同的字符了。 哈哈,这下可以够用了吧。 事实上,没有到4字节那么多,中文也只用到两字节。事实上只收录了2万多个汉字,因为日常生活其实几千个汉字也就足够了。所以给孩子起名字如果使用的字超过这2万字的范围,那在电脑是无法录入的。
3,utf-8. 这样使用Unicode的话,所有字符都按照两个字符传就OK了。也就是原来的 ‘a’,现在也必须要传两个字符。这样一来美国人民不高兴了,这意味着好好的,网速下降了一半。这就不好玩了。假如你是一个美国人,本来下载一个电影要10个小时,现在变成20个小时了。
这样,只好开发出了第三种编码,也就是utf8. 它的目的就是为了让美国人和中国人都高兴。
具体来说,这是一种变长的编码规范。在utf8中,原来的ascii的部分,还是使用一个字符。保证速度不会下降。作为牺牲,对于中文部分,就要使用3个字符来传递。也就是为了提高他们的使用舒适度,降低了我们的使用舒适度。
写到这里,又有一丝丝感慨。
下面是一个Unicode转换到utf8的规则。只要手动转汉字一个就清楚了。
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
—————————————————————–
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
在Python中实验Unicode和UTF8
python 中 str其实是字节串, unicode才是真正意义上的字符串
这段代码千万不要忽略了第一句。# coding: UTF-8
这表明这个代码的源文件使用utf8进行编写。因为你在源文件中使用了中文。 如果你使用了中文,而没有这个声明的话,编译肯定都要出错的。就会报下面的错误。
在Python中,字符串前面加个u,这个字符串就用Unicode编码了。Unicode使用双字节编码,所以对于”汉”这个字符,len测长度就是1,因为这确实是一个字。在Unicode中,“汉”的编码是6c49
对于变量b,没有在字符串前加u,因为源文件是用utf8编码的,所以变量b的字符串就是用utf8编码的。
类型是str。len测试长度是3。表示这个字在用utf8编码后,要用3个字节来表示。”汉”在utf8中的编码是\xe6\xb1\x89。 可以自己用上面的规则,手工进行一下Unicode到utf8的转化,就更清楚了。
decode 和 encode的方向问题
程序的后两句说明
从unicode到str的过程叫做编码encode,
返回来,从str 到 Unicode的过程叫做 解码decode。
源文件字符编码声明
源代码文件中,如果有用到非ASCII字符,则需要在文件头部进行字符编码的声明,如下:
实际上Python只检查#、coding和编码字符串,其他的字符都是为了美观加上的。
所以
这两句是一样的。
另外,Python中可用的字符编码有很多,并且还有许多别名,还不区分大小写,比如UTF-8可以写成u8。
改变系统编码
import sys
reload(sys) # Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入sys模块。
sys.setdefaultencoding(‘utf-8’)
参考地址:
Python字符编码详解
http://bbs.ednchina.com/BLOG_ARTICLE_2065523.HTM
http://www.zhihu.com/question/23374078