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
import sys
import urllib

a=u"汉"
print type(a) #<type 'unicode'>
print len(a) #1
print repr(a) #u'\u6c49'

print

b="汉"
print type(b) #<type 'str'>
print len(b) #3
print repr(b) #'\xe6\xb1\x89'



s2 = b.decode('UTF-8')
print s2 #汉
print type(s2) #<type 'unicode'>

print

s3 = a.encode('UTF-8')
print s3 #汉
print type(s3) #<type 'str'>

这段代码千万不要忽略了第一句。# coding: UTF-8
这表明这个代码的源文件使用utf8进行编写。因为你在源文件中使用了中文。 如果你使用了中文,而没有这个声明的话,编译肯定都要出错的。就会报下面的错误。

"test_urlencode.py", line 4
SyntaxError: Non-ASCII character '\xe6' in file urlencode.py on line 4, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

在Python中,字符串前面加个u,这个字符串就用Unicode编码了。Unicode使用双字节编码,所以对于”汉”这个字符,len测长度就是1,因为这确实是一个字。在Unicode中,“汉”的编码是6c49

对于变量b,没有在字符串前加u,因为源文件是用utf8编码的,所以变量b的字符串就是用utf8编码的。
类型是str。len测试长度是3。表示这个字在用utf8编码后,要用3个字节来表示。”汉”在utf8中的编码是\xe6\xb1\x89。 可以自己用上面的规则,手工进行一下Unicode到utf8的转化,就更清楚了。

Python 字符编码学习-ascii编码,Unicode和UTF-8之间的关系_python

decode 和 encode的方向问题
程序的后两句说明
从unicode到str的过程叫做编码encode,
返回来,从str 到 Unicode的过程叫做 解码decode。

源文件字符编码声明

源代码文件中,如果有用到非ASCII字符,则需要在文件头部进行字符编码的声明,如下:

#-*- coding: UTF-8 -*-

实际上Python只检查#、coding和编码字符串,其他的字符都是为了美观加上的。
所以

#-*- coding: UTF-8 -*-
#coding: UTF-8

这两句是一样的。

另外,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​