python_04

對(duì)于單個(gè)字符的編碼,Python提供了ord()函數(shù)獲取字符的整數(shù)表示,chr()函數(shù)把編碼轉(zhuǎn)換為對(duì)應(yīng)的字符:

    >>> ord('A')
    65
    >>> ord('中')
    20013
    >>> chr(66)
    'B'
    >>> chr(25991)
    '文'

如果知道字符的整數(shù)編碼,還可以用十六進(jìn)制這么寫(xiě)str:

    >>> '\u4e2d\u6587'
    '中文'

兩種寫(xiě)法完全是等價(jià)的。

由于Python的字符串類型是str,在內(nèi)存中以Unicode表示,一個(gè)字符對(duì)應(yīng)若干個(gè)字節(jié)。如果要在網(wǎng)絡(luò)上傳輸,或者保存到磁盤(pán)上,就需要把str變?yōu)橐宰止?jié)為單位的bytes。

Python對(duì)bytes類型的數(shù)據(jù)用帶b前綴的單引號(hào)或雙引號(hào)表示:

x = b'ABC'

要注意區(qū)分'ABC'和b'ABC',前者是str,后者雖然內(nèi)容顯示得和前者一樣,但bytes的每個(gè)字符都只占用\color{red}{一個(gè)字節(jié)。}

以Unicode表示的str通過(guò)encode()方法可以\color{purple}{編碼}為指定的bytes,例如:

    >>> 'ABC'.encode('ascii')
    b'ABC'
    >>> '中文'.encode('utf-8')
    b'\xe4\xb8\xad\xe6\x96\x87'
    >>> '中文'.encode('ascii')
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

純英文的str可以用ASCII編碼為bytes,內(nèi)容是一樣的,\color{red}{含有中文的str可以用UTF-8編碼為bytes。含有中文的str無(wú)法用ASCII編碼},因?yàn)橹形木幋a的范圍超過(guò)了ASCII編碼的范圍,Python會(huì)報(bào)錯(cuò)。

在bytes中,無(wú)法顯示為ASCII字符的字節(jié),用\x##顯示。
反過(guò)來(lái),如果我們從網(wǎng)絡(luò)或磁盤(pán)上讀取了字節(jié)流,那么讀到的數(shù)據(jù)就是bytes。要把bytes變?yōu)閟tr,就需要用decode()方法來(lái)\color{purple}{解碼}

    >>> b'ABC'.decode('ascii')
    'ABC'
    >>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
    '中文':

如果bytes中包含無(wú)法解碼的字節(jié),decode()方法會(huì)報(bào)錯(cuò):

    >>> b'\xe4\xb8\xad\xff'.decode('utf-8')
    Traceback (most recent call last):
    ...
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte

如果bytes中只有一小部分無(wú)效的字節(jié),可以傳入errors='ignore'忽略錯(cuò)誤的字節(jié):

    >>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
    '中'

要計(jì)算str包含多少個(gè)字符,可以用len()函數(shù):

    >>> len(b'ABC')
    3
    >>> len(b'\xe4\xb8\xad\xe6\x96\x87')
    6
    >>> len('中文'.encode('utf-8'))
    6

可見(jiàn),1個(gè)中文字符經(jīng)過(guò)UTF-8編碼后通常會(huì)占用\color{purple}{3}個(gè)字節(jié),而1個(gè)英文字符只占用\color{purple}{1}個(gè)字節(jié)。

在操作字符串時(shí),我們經(jīng)常遇到str和bytes的互相轉(zhuǎn)換。為了避免亂碼問(wèn)題,應(yīng)當(dāng)始終堅(jiān)持使用UTF-8編碼對(duì)str和bytes進(jìn)行轉(zhuǎn)換。

由于Python源代碼也是一個(gè)文本文件,所以,當(dāng)你的源代碼中包含中文的時(shí)候,在保存源代碼時(shí),就需要?jiǎng)?wù)必指定保存為UTF-8編碼。當(dāng)Python解釋器讀取源代碼時(shí),為了讓它按UTF-8編碼讀取,我們通常在文件開(kāi)頭寫(xiě)上這兩行:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-

第一行注釋是為了告訴Linux/OS X系統(tǒng),這是一個(gè)Python可執(zhí)行程序,Windows系統(tǒng)會(huì)忽略這個(gè)注釋;

第二行注釋是為了告訴Python解釋器,按照UTF-8編碼讀取源代碼,否則,你在源代碼中寫(xiě)的中文輸出可能會(huì)有亂碼。

申明了UTF-8編碼\color{purple}{并不意味著}你的.py文件就是UTF-8編碼的,必須并且要確保文本編輯器正在使用UTF-8 without BOM編碼:

index4.png

\color{red}{格式化}

占位符
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 字符集和編碼簡(jiǎn)介 在編程中常??梢砸?jiàn)到各種字符集和編碼,包括ASCII,MBCS,Unicode等字符集。確切的說(shuō)...
    蘭山小亭閱讀 9,077評(píng)論 0 13
  • 前言 首先,本次立項(xiàng)項(xiàng)目只是為了做網(wǎng)絡(luò)爬蟲(chóng),本身不需要Python完整的知識(shí)鏈。因此,對(duì)于基本語(yǔ)法,我會(huì)浮光掠影,...
    OzanShareing閱讀 1,203評(píng)論 3 2
  • 1 字符編碼簡(jiǎn)介 1.1 ASCII ASCII:American Standard Code for Infor...
    hufengreborn閱讀 8,531評(píng)論 3 23
  • 1、字符串編碼 字符串也是一種數(shù)據(jù)類型,但是,字符串比較特殊的是還有一個(gè)編碼問(wèn)題。 因?yàn)橛?jì)算機(jī)只能處理數(shù)字,如果要...
    Hello密斯托李閱讀 388評(píng)論 0 0
  • 字符編碼 我們已經(jīng)講過(guò)了,字符串也是一種數(shù)據(jù)類型,但是,字符串比較特殊的是還有一個(gè)編碼問(wèn)題。 因?yàn)橛?jì)算機(jī)只能處理數(shù)...
    luckybabying閱讀 336評(píng)論 0 0

友情鏈接更多精彩內(nèi)容