基本
在 Python 3 中, str
是启用 unicode 的字符串的类型,而 bytes
是原始字节序列的类型。
type("f") == type(u"f") # True, <class 'str'>
type(b"f") # <class 'bytes'>
**在 Python 2 中,**一个临时字符串默认是一个原始字节序列,而 unicode 字符串是每个带有 u
前缀的字符串。
type("f") == type(b"f") # True, <type 'str'>
type(u"f") # <type 'unicode'>
Unicode 到字节
可以使用 .encode(encoding)
将 Unicode 字符串转换为字节。
Python 3
>>> "£13.55".encode('utf8')
b'\xc2\xa313.55'
>>> "£13.55".encode('utf16')
b'\xff\xfe\xa3\x001\x003\x00.\x005\x005\x00'
Python 2
在 py2 中,默认的控制台编码是 sys.getdefaultencoding() == 'ascii'
而不是 py3 中的 utf-8
,因此不能像上一个例子那样打印它。
>>> print type(u"£13.55".encode('utf8'))
<type 'str'>
>>> print u"£13.55".encode('utf8')
SyntaxError: Non-ASCII character '\xc2' in...
# with encoding set inside a file
# -*- coding: utf-8 -*-
>>> print u"£13.55".encode('utf8')
£13.55
如果编码无法处理字符串,则会引发 UnicodeEncodeError
:
>>> "£13.55".encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character '\xa3' in position 0: ordinal not in range(128)
字节到 unicode
可以使用 .decode(encoding)
将字节转换为 unicode 字符串。
只能通过适当的编码将字节序列转换为 unicode 字符串!
>>> b'\xc2\xa313.55'.decode('utf8')
'£13.55'
如果编码无法处理字符串,则会引发 UnicodeDecodeError
:
>>> b'\xc2\xa313.55'.decode('utf16')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/csaftoiu/csaftoiu-github/yahoo-groups-backup/.virtualenv/bin/../lib/python3.5/encodings/utf_16.py", line 16, in decode
return codecs.utf_16_decode(input, errors, True)
UnicodeDecodeError: 'utf-16-le' codec can't decode byte 0x35 in position 6: truncated data