Python str字串和unicode字串

2021-08-20 13:56:05 字數 2802 閱讀 7176

這就需要給出符號-二進位制之間的對映關係,而且必須是一一對映:即給定乙個符號,機器有而且有唯一的二進位制對應。根據字元得到二進位制表示是編碼過程(encode);根據二進位制表示得到字元是解碼過程(decode)。

剛開始的時候,給出了ascii標準,用乙個8bits位元組來表示字元。而且這個位元組實際上只用了7位,最高位是不用的,這樣總共能表示128個字元。意味著ascii字符集只有128個。

隨著計算機的普及,越來越多的國家開始使用計算機。128個字元難以滿足各個國家的語言需求,這促使包含更多字元的字符集誕生,並且需要採用新的編碼方案。

充分利用8bits位元組的高位,擴充套件到256個字元。

unicode字符集包含了所有種語言的所有字元。通常用u+後接4位的16進製制數字表示乙個unicode字元,比如u+ffff。

utf-8是針對unicode字符集的一種編碼方案。

用變長位元組來表示字元:有的字元用乙個位元組表示(比如ascii中規定的字元),有的字元用2個位元組表示。最大長度為4位元組。

上面這張圖是從wikipedia中擷取的。number of bytes列表示位元組數;bits for code point列表示多少個bit位是真正有用的;first code point列表示該位元組數能表示的第乙個unicode字元;last code point列表示對應位元組數能表示的最後乙個unicode字元;byte i(i=1,2,3,4)列表示第i位元組上的bit值。 

以第二行為例,這一行的編碼需要兩個位元組,其中真正有用的bit位只有11個,另5位是佔位符,能表示從u+0080~u+07ff的unicode字元。

至於具體的編碼方式,我們以歐元符號€為例。€在unicode字符集中對應u+20ac:

unicode字符集還有其他的編碼方式,這裡就介紹到這裡。

要記住:所有的編碼方式都是向後相容ascii的。ascii字元對應什麼二進位制,那麼在其他編碼方式中也對應同樣的二進位制。

python包含兩種字串型別:str(其實就是二進位制)和unicode。當只會用到ascii字符集時,一切相安無事。一旦出現其他字符集,問題也就接踵而來。所以下面我們著重介紹非ascii字串。

>>> x = '哈哈'

>>> x

'\xb9\xfe\xb9\xfe'

根據上面的列印結果,可以知道str型別的x存的其實是二進位制序列,而非字串。為什麼會出現這種情況呢?我們賦給x的明明是字串。

其實很簡單,x經過了一次**的編碼過程encode()。應該採用的是系統預設編碼方案。 

- unicode型別 

如果在引號的前面加上字元u,那麼我們就得到乙個unicode字串:

>>> x = u'哈哈'

>>> x

u'\u54c8\u54c8'

unicode物件儲存的是字串本身,而非二進位制序列。比如程式中的unicode字串中包含兩個u+54c8字元。

但是有的時候,我們需要二進位制序列,比如將資料寫入檔案、傳送到網路或者寫入資料庫中時。如果不進行任何處理,會出現錯誤:

>>> x = u'哈哈'

>>> x

u'\u54c8\u54c8'

>>> f = open('test.txt', 'w');

>>> f.write(x)

traceback (most recent call last):

file "", line 1, in

unicodeencodeerror: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

這是因為在把字串寫入檔案時,會首先檢查字串的型別,如果是str型別的字串,那麼一切ok;如果是unicode型別的字串,那麼會隱式地對其編碼,即x.encode()。而系統預設的編碼方案是ascii(可以通過sys.getdefaultencoding()檢視),對非ascii字元進行編碼的時候,肯定會出現錯誤。

為了避免錯誤,在寫入檔案之前,應該用utf-8或者gbk編碼方案對unicode字串編碼:

>>> x = u'哈哈'

>>> x

u'\u54c8\u54c8'

>>> f = open('test.txt', 'w');

>>> x = x.encode('utf-8') #unicode -> str

>>>x

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

>>> f.write(x)

當從文字中讀取資料時,讀到的是str字串,而且我們已經知道,它儲存的是二進位制序列。如果其中包含非ascii文字,我們應該怎麼恢復呢?這時候就要用到解碼decode()。

>>> f = open('test.txt', 'w');

>>> x = f.read()

>>> x

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

>>> x = x.decode('utf-8') #str -> unicode

>>> x

u'\u54c8\u54c8'

一定要記得,用什麼方式編碼的就必須用什麼方式解碼。不然的話,從二進位製到字元的對應過程會出現unicodedecodeerror。

print語句的引數需要是str型別,而且在執行的時候會用系統的編碼方式對str進行隱式解碼。

python str字串處理

python字串處理函式 find和index區別,前者找不到返回 1,後者找不到報錯 print aaab find 9 輸出 1 print aaab find b 3 print aaab rfind a 2 加r從右開始找 print aaab rindex a 2 print aaab c...

Python str字串常用操作

str轉換字串 s str 31 s 31 replace替換 s a 5 s aaaaa s.replace a b bbbbb s aaaaa s s.replace a b 5 s bbbbb capitalize第乙個字元變為大寫 str yang str.capitalize yang u...

人生苦短 我用Python str 字串

1 字串 str 2 str 1 hello,selenium,888,999 3 4 切片 截斷5 更換大小寫 upper lower 英文本元 6print str 1.upper 7print str 1.lower 89 split 分隔符,次數 對字串進行切割 返回結果是乙個列表 10pr...