基本

在 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