第4章 文字和位元組序列(上)

2021-09-11 15:52:26 字數 3476 閱讀 7678

unicode標準把字元的標識和具體的位元組表述進行如下區分:

將碼位轉換成位元組序列的過程是編碼,把位元組序列轉換成碼位的過程是解碼。如下例:

>>

> b=

"哈哈哈"

.encode(

'utf-8'

)>>

> b

b'\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88'

>>

> b.decode(

'utf-8'

)'哈哈哈'

python內建兩種基本二進位制序列型別:python3引入的不可變bytes型別和python2.6新增的可變bytearray型別。

二者物件的各個元素是介於0-255之間的整數。二進位制序列的切片始終是同一型別的二進位制序列,包括長度為1的切片。如下所示:

>>

> a=

bytes

('哈哈哈'

,encoding=

'utf-8'

)>>

> a

b'\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88'

>>

> a[0]

229>>

> a[:1

]b'\xe5'

>>

> a_arr=

bytearray

(a)>>

> a_arr

bytearray

(b'\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88'

)>>

> a_arr[-1

:]bytearray

(b'\x88'

)

a[0]返回229,a[:1]返回bytes物件切片。

雖然二進位制序列其實是整數序列,但是它們的字面量表示法表明其中有ascii文字。因此,各個位元組的值可能會使用如下三種不同的顯示方式:

struct模組提供了一些函式,可把打包的位元組序列轉換成不同型別字段組成的元組,還有一些函式用於執行反向轉換,把元組轉換成打包的位元組序列。

struct模組能處理bytes、bytearray和memoryview物件。

*表明該編碼不支援表示該字元

典型編碼介紹如下:

多數非utf編解碼器只能處理unicode字元的一小部分子集。把文字轉換成位元組序列時,如果目標編碼中沒有定義某個字元,那就會丟擲unicodeencodeerror異常,除非把errors引數傳遞給編碼方法或函式,對錯誤進行特殊處理。如下例所示:

>>

> city=

"北京"

>>

> city.encode(

'utf-8'

)b'\xe5\x8c\x97\xe4\xba\xac'

>>

> city.encode(

'gb2312'

)b'\xb1\xb1\xbe\xa9'

>>

> city.encode(

'cp437'

)traceback (most recent call last)

: file ""

, line 1,in

city.encode(

'cp437'

) file "g:\python\lib\encodings\cp437.py"

, line 12

,in encode

return codecs.charmap_encode(

input

,errors,encoding_map)

unicodeencodeerror:

'charmap' codec can't encode characters in position 0-1

: character maps to

>>

> city.encode(

'cp437'

,errors=

"ignore"

)b''

>>

> city.encode(

'cp437'

,errors=

'replace'

)b'??'

>>

> city.encode(

'cp437'

,errors=

"xmlcharrefreplace"

)b'北京'

當cp437無法編碼漢字時,丟擲unicodeencodeerror。

對error引數的設定說明如下:

不是每乙個位元組都包含有效的ascii字元,也不是每乙個字串行都是有效的utf-8或utf-16。因此,把二進位制序列轉換成文字時,如果假設是這兩個編碼中的乙個,遇到無法轉換的位元組序列時會丟擲unicodedecodeerror。如下例:

>>

> octets=b'montr\xe9al'

>>

> octets.decode(

'cp1252'

)'montréal'

>>

> octets.decode(

'iso8859_7'

)'montrιal'

>>

> octets.decode(

'koi8_r'

)'montrиal'

>>

> octets.decode(

'utf-8'

)traceback (most recent call last)

: file ""

, line 1,in

octets.decode(

'utf-8'

)unicodedecodeerror:

'utf-8' codec can't decode byte 0xe9

in position 5

: invalid continuation byte

>>

> octets.decode(

'utf-8'

,errors=

'replace'

)'montr�al'

不同的編解碼器將相同的位元組解碼成不同的字元,對於utf-8解碼器,丟擲異常。

python3預設使用utf-8編碼原始碼。gnu/linux和os x系統大都使用utf-8編碼,因此開啟windows系統中使用cp1252編碼的.py檔案時可能發生報錯。

為修正此問題,可在檔案頂部新增乙個神奇的coding注釋

# coding: utf-8
python允許在原始碼中使用非ascii識別符號,這意味著變數名,函式名等可以是中文

第4章 文字和位元組序列 了解編碼問題

常見編譯碼異常 unicodeencodeerror 編碼錯誤,將字串編碼成位元組串 二進位制位元組序列 時的異常 unicodedecodeerror 解碼錯誤,將位元組串 二進位制位元組序列 解碼成字串時的異常 syntaxerror 如果原始碼的編碼與預期不符,載入 python 模組時還可能...

C Primer 第4版 第4章 陣列和指標

p95 設計良好的程式只有在強調速度時才在類實現的內部使用陣列和指標。p96陣列的維數必須用值大於等於1的常量表示式定義。此常量表示式只能包含整型字面值常量 列舉型別或者用常量表示式初始化的整型const物件。非const物件以及要到執行階段才知道其值的const變數都不能用於定義陣列的維數。p97...

第4章陣列和指標

陣列的定義和初始化 注意 1.顯示初始化陣列元素 在函式體外定義的內建陣列,其元素均初始化為0 在函式體內定義的內建陣列,其元素無初始化 不管陣列在 定義,如果其元素為類型別,則自動呼叫該類的預設建構函式進行初始化,如果該類沒有預設建構函式,則必須為該陣列的元素提供顯式的初始化。2.特殊的字元陣列 ...