python的unicode编码_pythonunicode编码
遇到编码问题,查阅了⼀些资料,有了⼀些理解,简单记录下。
⾸先,Unicode有个通⽤字符集
其次,每个字符有个编号(编码,即code points),规范为U+hhhh,其中每个h代表⼀个⼗六进制数字
最后,有多种实现⽅式,即⼀个字符的编号可以⽤多种⽅式来表⽰,例如UTF-8、UTF-16中对同⼀个字符编号(code point)的表⽰不⼀样
1.1 字符集
Unicode的学名是”Universal Multiple-Octet Coded Character Set”,简称为UCS。UCS可以看作是”Unicode Character Set”的缩写。
可以看出,Unicode定义了⼀个字符集,包括世界上⼤部分的⽂字符号。
1.2 Unicode编码
⼀个字符的Unicode编码是确定的,但是不同实现⽅式对同⼀个字符的编码值不⼀样,所以同⼀个字符
⽤不同的实现⽅式编码/解码就会出现乱码。
如果⼀个仅包含基本7位ASCII字符的Unicode⽂件,如果每个字符都使⽤2字节的原Unicode编码传输,其第⼀字节的8位始终为0。
这就造成了⽐较⼤的浪费。对于这种情况,可以使⽤UTF-8编码,这是⼀种变长编码,它将基本7位ASCII字符仍⽤7位编码表⽰,占⽤⼀个字节
(⾸位补0)。⽽遇到与其他Unicode字符混合的情况,将按⼀定算法转换,每个字符使⽤1-3个字节编码,并利⽤⾸位为0或1进⾏识别。这样对
以7位ASCII字符为主的西⽂⽂档就⼤幅节省了编码长度。
1.3 UTF实现⽅式
⼀个字符的Unicode编码是确定的,在实际传输/存储中,出于节省空间的⽬的,对Unicode编码的实现⽅式有所不同。
Unicode的实现⽅式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)。
Unicode的实现⽅式包括UTF-7、Punycode、CESU-8、SCSU、UTF-32、GB18030等,这些实现⽅式有些仅在⼀定的国家和地区使⽤,有些则
属于未来的规划⽅式。⽬前通⽤的实现⽅式是UTF-16⼩端序(LE)、UTF-16⼤端序(BE)和UTF-8。
2. python编码
2.1 Unicode string
a Unicode string is a sequence of code points, which are numbers from 0 to 0x10ffff.
A code point is an integer value, usually denoted in base 16.
2.2 Encoding
a Unicode string is a sequence of code points, which are numbers from 0 to 0x10ffff.
This sequence needs to be represented as a set of bytes (meaning, values from 0–255) in memory.
The rules for translating a Unicode string into a sequence of bytes are called an encoding.
Python’s default encoding is the ‘ascii’ encoding.
2. If the code point is 128 or greater, the Unicode string can’t be represented in this encoding.
(Python raises a UnicodeEncodeError exception in this case.)
2.3 代码⽂件的编码
# -*- coding=utf-8 -*- ⽤来指定.py的源码⽂件⽤utf-8规则编码,这样就可以在源码⽂件中正常显⽰中⽂这样的⾮ASCII字符。
⽂件的编码表⽰该⽂件能表⽰哪些字符(字符集),⽐如指定了ASCII那就不能表⽰中⽂,因为ASCII字符集中没有中⽂字符。
2.4 python编码实验
通过前⾯的知识知道,⼀个字符的Unicode编码是确定的,即code point是固定的,因此各种字符编码之间的转换可以对标code point进⾏。
因为任何⼀个字符,都可以在Unicode编码中(例如UTF-8)对应⼀个编码(数字),所以不同字符集之间的转换,只要都对应到Unicode中的code point即可完成。中文字符unicode查询
例如要把GBK编码的字符转换成UTF-8编码来保存/传输,可以先转换成Unicode中的编码(code point),然后到该code point在UTF-8中对应的编码即可。
即 GBK –> Unicode –> UTF-8
GBK –> Unicode 称为解码,即解码成为unicode,Unicode –> UTF-8 称为编码,即编码为UTF-8格式。
所以unicode相当于是明⽂,GBK、UTF-8相当是各种加密算法,从⼀种密⽂(GBK)转换成另⼀种密⽂(UTF-8),必须先转换成明⽂(unicode),再⽤对应的
加密算法(UTF-8)加密⽣成对应的密⽂。
如下实验在secureCRT终端进⾏,编码设置为UTF-8(相当于在.py⽂件中设置了 -- coding=utf-8 --),因此可以正常显⽰中⽂。
通过defaultencoding()得到当前系统默认编码是ascii,python⾥的de和str.decode不指定时都使⽤系统默认编码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
88
89
90
91
92
93
94
95
96Python 2.6.6 (r266:84292, Jan 22 2014, 01:49:05)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import sys
>>>
>>> defaultencoding() # 系统默认编码
'ascii'
>>>
>>> s = u'中国' # unicode类型
>>> type(s)
>>>
>>> s.encode('utf-8').decode('utf-8') # 对unicode调⽤decode相当于先encode再decode u'u4e2du56fd'
>>>
>>> s
u'u4e2du56fd' # unicode⾥"中国"的code point
>>> print(s)
中国
>>>
>>> s.encode('utf-8') # 转换为utf-8编码

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。