字串位元組與 Unicode

Python 2.x <= 2.7

在 Python 2 中,有兩種字串變體:由位元組型別( str )組成的字串和由型別( unicode )的文字組成的字串

在 Python 2 中,str 型別的物件始終是位元組序列,但通常用於文字和二進位制資料。

字串文字被解釋為位元組字串。

s = 'Cafe'    # type(s) == str

有兩個例外:你可以通過在文字前加上 u 來明確定義 Unicode(文字)文字

s = u'Café'   # type(s) == unicode
b = 'Lorem ipsum'  # type(b) == str

或者,你可以指定整個模組的字串文字應建立 Unicode(文字)文字:

from __future__ import unicode_literals

s = 'Café'   # type(s) == unicode
b = 'Lorem ipsum'  # type(b) == unicode

為了檢查你的變數是否是字串(Unicode 或位元組字串),你可以使用:

isinstance(s, basestring)

Python 3.x >= 3.0

在 Python 3 中,str 型別是 Unicode 文字型別。

s = 'Cafe'           # type(s) == str
s = 'Café'           # type(s) == str (note the accented trailing e)

此外,Python 3 新增了一個 bytes 物件 ,適用於二進位制 blob 或寫入與編碼無關的檔案。要建立位元組物件,可以將 b 作為字串文字的字首或呼叫字串的 encode 方法:

# Or, if you really need a byte string:
s = b'Cafe'          # type(s) == bytes
s = 'Café'.encode()  # type(s) == bytes

要測試值是否為字串,請使用:

isinstance(s, str)

Python 3.x >= 3.3

也可以在字串文字前加上 u 字首,以簡化 Python 2 和 Python 3 程式碼庫之間的相容性。因為在 Python 3 中,預設情況下所有字串都是 Unicode,所以使用 u 預先新增字串文字無效:

u'Cafe' == 'Cafe'

不支援 Python 2 的原始 Unicode 字串字首 ur

>>> ur'Café'
  File "<stdin>", line 1
    ur'Café'
           ^
SyntaxError: invalid syntax

請注意,你必須 encode 一個 Python 3 文字(str)物件將其轉換成文字的 bytes 表示。此方法的預設編碼為 UTF-8

你可以使用 decodebytes 物件詢問它所代表的 Unicode 文字:

>>> b.decode()
'Café'

Python 2.x >= 2.6

雖然 bytes 型別同時存在於 Python 2 和 3 中,但 unicode 型別僅存在於 Python 2 中。要在 Python 2 中使用 Python 3 的隱式 Unicode 字串,請將以下內容新增到程式碼檔案的頂部:

from __future__ import unicode_literals
print(repr("hi"))
# u'hi'

Python 3.x >= 3.0

另一個重要的區別是 Python 3 中的索引位元組會導致 int 輸出,如下所示:

b"abc"[0] == 97

雖然切片大小為 1 會導致長度為 1 個位元組的物件:

b"abc"[0:1] == b"a"

此外,Python 3 使用 unicode 修復了一些異常行為 ,即在 Python 2 中反轉位元組字串。例如,解決了以下問題

# -*- coding: utf8 -*-
print("Hi, my name is Łukasz Langa.")
print(u"Hi, my name is Łukasz Langa."[::-1])
print("Hi, my name is Łukasz Langa."[::-1])

# Output in Python 2
# Hi, my name is Łukasz Langa.
# .agnaL zsakuŁ si eman ym ,iH
# .agnaL zsaku�� si eman ym ,iH

# Output in Python 3
# Hi, my name is Łukasz Langa.
# .agnaL zsakuŁ si eman ym ,iH
# .agnaL zsakuŁ si eman ym ,iH