【總結】Python 2.x中常見字符編碼和解碼方面的錯誤及其解決辦法

Python 2.x中的字符編碼,設計的的確不好,導致初學者,甚至是即使用Python很長時間的人,都會經常遇到字符編解碼方面的錯誤。

下面就把一些常見情,儘量的都整理出來,並給出相應的解決辦法。


看此文之前

Python中字符編碼所涉及的背後邏輯(從你輸入字符,到終端顯示字符的背後過程)

在去了解Python編碼解碼之前,還有個更加重要,但是很多時候卻被其他解釋相關知識的人所忽略的問題,那就是:

對於Python中字符串,輸入輸出的背後邏輯。

即,知其所以然。

 

此處就簡單介紹一下,在Python中,從你所輸入的字符串,到顯示出字符串,這背後的過程是什麼樣的。

只有瞭解了這個大概的過程,和背後的邏輯,你才能真正理解後面的所解釋的,字符串編碼解碼方面的錯誤,以及如何解決這樣的錯誤。

 

對於你

你只是看到的是:

  • 你輸入了字符串
    • 不論是從Python的IDLE中輸入的
    • 還是寫入到Python文件中的
  • 然後你去運行的對應代碼,該Python代碼,經過Python系統,(此處及之後,我稱其爲Python解析器),的處理
  • 使得你可以看到最終所輸出的字符串
    • 不論是在Python的IDLE中看到的
    • 還是在windows的cmd中看到的。

 

對於Python解析器

而Python解析器所幹的事情,就是:

  1. Python解析器,根據當前的所用的字符串編碼類型
    • 此字符串編碼類型,是你自己所設置的
      • 不論是在Python的IDLE中,還是Python文件中
      • 都是你自己顯示指定對應的編碼類型的

    • 當然你沒顯示的指定的話,那就用默認的配置
      • 如果是Python的IDLE,如果你沒修改defaultencoding,那麼就使用默認的字符編碼
        • 可以通過sys.getdefaultencoding()而獲得,比如此處獲得是:ascii
        • idle sys.getdefaultencoding
      • 如果是Python文件,如果你沒聲明文件編碼,則使用默認的編碼:UTF-8
        • 常見的做法是指定爲對應的UTF-8類型:# -*- coding: utf-8 -*-
          • 相關內容,不瞭解的可參考:【整理】關於Python腳本開頭兩行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件編碼類型
  2. 去執行你的Python代碼
    • 其中,很常見的幾種動作是:
      • 打印print對應的所獲得的字符
        • 對於字符串打印,Python的邏輯:
          • 如果是Unicode字符串,則可以,自動地,編碼爲對應的終端所用編碼,然後正確的顯示出來
            • 比如unicode的字符串,輸出到windows的默認編碼爲GBK的cmd中,則Python可以自動將Unicode編碼爲GBK,然後輸出到cmd中
            • 個別特殊情況,也會出錯:
              • 當此unicode字符串中包含某特殊字符,而目標終端的編碼集合中,沒有此字符,則很明顯也是無法實現將Unicode編碼爲對應的特定編碼的字符串,無法正確顯示的
          • 如果是某種編碼類型的str,則需要該str的編碼類型,和目標終端編碼匹配
            • 比如GBK的字符串,輸出到windows的默認編碼爲GBK的cmd,則是可以正常輸出的
              • 此處後來經過代碼測試,就發現一個有趣或者說詭異的問題,雖然我們python文件聲明的UTF-8編碼,但是實際上實際上是用GBK編碼,而此時,文件中的字符串,很明顯是用GBK存儲的,所以,將此GBK字符,輸出到GBK的cmd中,是可以正常輸出的。即,此處字符串的類型,很明顯只和文件所用的實際編碼有關,而和文件所聲明的代碼無關。
            • 如果是UTF-8的字符串,輸出到windows的默認編碼爲GBK的cmd,就會出錯
      • 對相應的字符,進行編碼(爲某種特定類型的字符str),或解碼(爲對應的unicode類型的字符)
        • 比如將當前的某種編碼的字符串,解碼爲Unicode字符串
          • 很明顯,也是要保證,你字符串本身的編碼和所指定的編碼,兩者之間要一致的
            • 比如:decodedUnicode = someUtf8Str.decode("UTF-8")
            • 而如果用這樣的:decodedUnicode = someGbkStr.decode("UTF-8"),那就會出現錯誤

 

所以你要

  • 確保當前輸入的字符串的編碼,和對應的編碼設置一致,才能使得解析器正常解析你的字符串
  • 確保輸出字符串時,所用字符(的編碼)和目標輸出所用的編碼一致,才能正常在輸出終端顯示
  • 確保字符串本身的編碼,和你去解碼等操作所用的編碼一致,否則很明顯會由於編碼不一致而無法進行解碼(等操作)

 

常見錯誤簡介

很明顯,如果你不遵守上述規則,出現前面編碼不一致的情況,那麼就會出現一些常見的編碼解碼方面的錯誤了。

此處只是簡單舉例如下:

  • 你python文件本身是GBK的,對應的字符串也是GBK的,然後你指定按照UTF-8解碼爲對應的Unicode,那麼當然會導致人家Python解析器,按照UTF-8編碼的方式,去解析你的,實際上是GBK的字符,當然會出錯,無法解析了。
  • 你所要打印的字符,本身是UTF-8的,但是要打印輸出的終端是,windows的cmd,其默認編碼爲GBK,即將UTF-8的字符,顯示到GBK編碼的cmd中,當然也會出現錯誤了
  • 你所要打印出來的字符,雖然是unicode,但是其中包含了某些特殊字符,而對應的特殊字符在終端所用的編碼中不存在,比如將含某些特殊字符的Unicode字符串,打印到windows的默認編碼爲GBK的cmd中,而GBK編碼集合中,本身就沒有這些字符,所以,當然也是無法顯示,會出現對應的UnicodeEncodeError的錯誤的。

 

所以,諸如此類的問題,如果搞懂了之前的邏輯,那麼自然很容易理解其錯誤的根源,並找到解決辦法。

即,知其所以然,之後,更容易,知其然。

 

下面就來,故意的:

  • 再現,出各種Python 2.x中所常見的字符的編碼解碼等方面的錯誤;
  • 然後幫你找到問題的根本原因;
  • 進而找到問題所對應的解決辦法;

 

Python 2.x的字符編碼本身的設計的邏輯:str和unicode

想要了解Python 2.x中,字符串編解碼的問題和原因,首先搞懂Python 2.x中在字符串的方面是如何設計的,其主要分兩大類:str和unicode。

 

對於str和unicode的確切含義,以及如何互相轉換,以及Python 2.x和Python 3.x中的bytes和str,有何區別等內容

之前已經詳盡的總結了:

【整理】Python中字符編碼的總結和對比:Python 2.x的str和unicode vs Python 3.x的bytes和str 
不瞭解的,也是需要去看懂,然後才能真正明白下面的問題的原因的。

 


Python中常見字符的編碼和解碼方面的錯誤的現象,原因,及其解決辦法

 

提醒:

1.下面的代碼,如果想要拷貝粘貼到文件中去測試的話,請注意文本本身所用編碼。

未必一定是聲明的那個編碼;

詳情請自己看代碼中的中文說明。

不過最簡單的是,直接右鍵另存爲對應的python文件,省去你拷貝粘貼轉碼等煩心事了。

2. 關於代碼編輯器,推薦用Notepad++:

【crifan推薦】輕量級文本編輯器,Notepad最佳替代品:Notepad++ 
3. 其中對於文件轉換編碼等事宜,不瞭解的可以參考:

用Notepad++實現不同字符編碼之間的轉換

 

Python中,想要將某字符串解碼爲對應的Unicode,但是所使用的編碼類型和字符串本身的編碼不匹配

現象

字符串本身,是某種編碼類型的字符串,但是結果將其解碼爲對應的Unicode時,卻指定了另外一種編碼類型,導致無法正常的解碼爲對應的Unicode,而出現UnicodeDecodeError之類的錯誤。

 

比如用UTF-8去解碼GBK的字符串:

python_2.x_decode_gbk_use_utf8.py

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Function:
【總結】Python中常見字符編碼和解碼方面的錯誤及其解決辦法
 
 
Author:     Crifan
Verison:    2012-11-29
-------------------------------------------------------------------------------
"""
 
def python2xDecodeGbkWithUtf8():
    zhcnActualGbk = "此處你所看到的中文字符所處的環境是:\r\n1.當前文件用聲明的編碼是UTF-8。但是後來經過證明,此處實際上聲明爲GBK還是UTF-8,對於字符串本身的編碼,沒影響。字符串本身的編碼,之和當前文件的編碼有關;\r\n2.此處實際上文件本身卻是用的GBK編碼,所以你看到的當前的字符串也是GBK的。所以,後面要演示的:\r\n3.對於GBK的字符,指定用UTF-8方式去解碼,則會出錯。\r\n4.但是由於當前字符是GBK的,而後面要print打印出來到Windows的cmd中,其中cmd編碼(默認)爲GBK,所以,print函數是,不會出錯,可以正確顯示此處中文字符的";
    print "zhcnActualGbk=",zhcnActualGbk; #此處是可以正常打印出上述中文字符的
    zhcnUnicode = zhcnActualGbk.decode("UTF-8"); #UnicodeDecodeError: 'utf8' codec can't decode byte 0xb4 in position 0: invalid start byte
    print "zhcnUnicode=",zhcnUnicode; #上述解碼出錯,更不可能執行到這裏的print了
     
###############################################################################
if __name__=="__main__":
    python2xDecodeGbkWithUtf8();

 

要說明的是,此處是,只是爲了代碼演示,所以很明顯,就直接看出錯誤了。

但是實際的編程過程中,由於很多時候情況很複雜,未必立刻會意識到或注意到,編碼類型弄錯了,所以,也還是需要注意這種情況的。

 

原因

如上所述,想要把某種編碼的字符串解碼爲Unicode;

字符串是A編碼的(GBK),但是卻用B編碼(UTF-8)去解碼,導致出現UnicodeDecodeError錯誤;

 

解決辦法

使用和字符串本身編碼相同的編碼,去解碼,就可以正常的解碼爲Unicode了。

 

修改後的代碼如下:

python_2.x_decode_gbk_use_gbk.py

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Function:
【總結】Python中常見字符編碼和解碼方面的錯誤及其解決辦法
 
 
Author:     Crifan
Verison:    2012-11-29
-------------------------------------------------------------------------------
"""
 
def python2xDecodeGbkWithGbk():
    zhcnActualGbk = "此處你所看到的中文字符所處的環境是:\r\n1.當前文件用聲明的編碼是UTF-8。但是後來經過證明,此處實際上聲明爲GBK還是UTF-8,對於字符串本身的編碼,沒影響。字符串本身的編碼,之和當前文件的編碼有關;\r\n2.此處實際上文件本身卻是用的GBK編碼,所以你看到的當前的字符串也是GBK的。所以,後面要演示的:\r\n3.對於GBK的字符,使用同樣的GBK去解碼,則不會出錯了。\r\n4.而解碼後得到的Unicode字符串,也可以正常在Windows的默認編碼爲GBK的cmd中顯示了。其中,內部會自動將Unicode編碼爲GBK然後送到cmd中顯示的。";
    print "zhcnActualGbk=",zhcnActualGbk; #此處是可以正常打印出上述中文字符的
    zhcnUnicode = zhcnActualGbk.decode("GBK"); #此處使用和字符串本身一致的GBK解碼,就可以正常解碼爲Unicode了
    print "zhcnUnicode=",zhcnUnicode; #此處就可以正常輸出Unicode字符串了。內部會自動將Unicode編碼爲GBK,然後送到cmd中顯示的
     
###############################################################################
if __name__=="__main__":
    python2xDecodeGbkWithGbk();

 

舉一反三

如果你以後遇到類似的,UnicodeDecodeError,那麼說明是Unicode在解碼方面的錯誤,肯定是將某種編碼的字符串,解碼爲Unicode的過程中,出現的錯誤。

而錯誤原因,也往往都是編碼類型不匹配,然後就可以去檢查一下,是不是字符串本身的編碼,和你在調用decode時所設置的編碼不匹配。

 

Python中,打印字符串時,字符串本身的編碼,與輸出終端中所用編碼不匹配

現象

字符串本身,是某種編碼的,但是輸出,顯示,到終端時,終端所使用編碼,和你字符串的編碼不一樣,導致無法正常顯示。

比較常見的是,本身是UTF-8類型的字符串,但是卻將其輸出到Windows的cmd中,而cmd中默認是GBK編碼的,導致兩者不匹配,所以打印字符串時,出現亂碼:

python_2.x_print_utf8_to_gbk.py

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Function:
【總結】Python中常見字符編碼和解碼方面的錯誤及其解決辦法
 
 
Author:     Crifan
Verison:    2012-11-29
-------------------------------------------------------------------------------
"""
 
def python2xPrintUtf8ToGbk():
    zhcnUtf8 = "此處你所看到的中文字符所處的環境是:\r\n1.當前文件用聲明的編碼是UTF-8。但是後來經過證明,此處實際上聲明爲GBK還是UTF-8,對於字符串本身的編碼,沒影響。字符串本身的編碼,只和當前文件的編碼有關;\r\n2.不過呢,此處文件本身的編碼的確是UTF-8的,所以你看到的當前的字符串也是UTF-8編碼的。所以,後面要演示的:\r\n3.對於UTF-8的字符,去打印輸出到Windows的默認編碼爲GBK的cmd中,就會出現亂碼錯了。";
    print "zhcnUtf8=",zhcnUtf8; #把UTF-8的字符串,輸出到GBK的cmd中,結果顯示的都是亂碼:
     
    # zhcnUtf8= 姝ゅ浣犳墍鐪嬪埌鐨勪腑鏂囧瓧絎︽墍澶勭殑鐜鏄細
    # 1.褰撳墠鏂囦歡鐢ㄥ0鏄庣殑緙栫爜鏄疷TF-8銆備絾鏄悗鏉ョ粡榪囪瘉鏄庯紝姝ゅ瀹為檯涓婂0鏄庝負GBK榪樻槸UTF-8錛屽浜庡瓧絎︿覆鏈韓鐨勭紪鐮侊紝娌″獎鍝嶃€傚瓧絎︿覆鏈韓鐨勭紪鐮侊紝鍙拰褰撳墠鏂囦
    # 歡鐨勭紪鐮佹湁鍏籌紱
    # 2.涓嶈繃鍛紝姝ゅ鏂囦歡鏈韓鐨勭紪鐮佺殑紜槸UTF-8鐨勶紝鎵€浠ヤ綘鐪嬪埌鐨勫綋鍓嶇殑瀛楃涓蹭篃鏄疷TF-8緙栫爜鐨勩€傛墍浠ワ紝鍚庨潰瑕佹紨紺虹殑錛?
    # 3.瀵逛簬UTF-8鐨勫瓧絎︼紝鍘繪墦鍗拌緭鍑哄埌Windows鐨勯粯璁ょ紪鐮佷負GBK鐨刢md涓紝灝變細鍑洪敊浜嗐€
     
###############################################################################
if __name__=="__main__":
    python2xPrintUtf8ToGbk();

 

原因

把Python文件中的字符串,該Python文件是UTF-8的,所以該字符串也是UTF-8編碼的,輸出到Windows的cmd中,而cmd中默認編碼爲GBK,即

把UTF-8的字符串,在GBK的cmd上顯示,則出現了亂碼。

 

解決辦法

目的是爲了是要輸出的字符串的編碼,是Unicode,或者和目標輸出終端的編碼一致,就可以正常輸出了。

所以可以把UTF-8的字符,解碼爲對應的Unicode,。

(也可以進一步的,把Unicode字符串,編碼爲GBK)

然後再輸出到GBK的cmd中,就可以正常顯示,不是亂碼了:

python_2.x_dec_utf8_then_to_gbk.py

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Function:
【總結】Python中常見字符編碼和解碼方面的錯誤及其解決辦法
 
 
Author:     Crifan
Verison:    2012-11-29
-------------------------------------------------------------------------------
"""
 
def python2xDecodeUtf8ThenOutputToGbk():
    zhcnUtf8 = "此處你所看到的中文字符所處的環境是:\r\n1.當前文件用聲明的編碼是UTF-8。但是後來經過證明,此處實際上聲明爲GBK還是UTF-8,對於字符串本身的編碼,沒影響。字符串本身的編碼,只和當前文件的編碼有關;\r\n2.不過呢,此處文件本身的編碼的確是UTF-8的,所以你看到的當前的字符串也是UTF-8編碼的。所以,後面要演示的:\r\n3.對於UTF-8的字符,先去指定用UTF-8去解碼爲Unicode,然後再去輸出到Windows的默認編碼爲GBK的cmd中,就不會出現亂碼錯了。或者是將得到的Unicode字符串,再編碼爲GBK,然後再輸出到GBK的cmd,也是同樣的效果。";
    print "zhcnUtf8=",zhcnUtf8; #把UTF-8的字符串,輸出到GBK的cmd中,結果顯示的都是亂碼:
    # zhcnUtf8= 姝ゅ浣犳墍鐪嬪埌鐨勪腑鏂囧瓧絎︽墍澶勭殑鐜鏄細 ......紝灝變細鍑洪敊浜嗐€
     
    decodedUnicode = zhcnUtf8.decode("UTF-8"); #用UTF-8解碼UTF-8的字符串位Unicode
    print "decodedUnicode=",decodedUnicode; #此處就可以正常輸出了,不會顯示亂碼了
    decodedUnicodeThenEncodedToGbk = decodedUnicode.encode("GBK"); #將Unicode的字符串,編碼爲GBK
    print "decodedUnicodeThenEncodedToGbk=",decodedUnicodeThenEncodedToGbk; #然後再輸出到GBK編碼的cmd,也是同樣可以正確顯示的
     
###############################################################################
if __name__=="__main__":
    python2xDecodeUtf8ThenOutputToGbk();

 

舉一反三

以後如果再遇到類似的亂碼,先去確定你的字符串本身是什麼編碼的。

再去確定,你所要輸出的終端目標中,所用的編碼是什麼樣的。

其中,輸出的終端,此處舉例所用的是,windows的cmd,其他還有可能是輸出內容到文件中,其中還涉及文件所用的編碼是什麼,這些都要自己搞清楚的。

總之,確保字符串編碼類型,和輸出所用的編碼類型,兩者是一致的,就不會出現亂碼了。

 

Python中,打印含某些特殊字符的Unicode類型字符串,但是輸出終端中字符編碼集中不包含這些特殊字符

現象

雖然已經獲得了Unicode的字符串了,但是當打印Unicode類型的字符串,到某些終端中時,結果卻還是出錯了。

比如,下面的例子中,就是把Unicode字符串,打印到Windows的cmd中,結果出錯:

python_2.x_print_unicode_still_error.py

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Function:
【總結】Python中常見字符編碼和解碼方面的錯誤及其解決辦法
 
 
Author:     Crifan
Verison:    2012-11-29
-------------------------------------------------------------------------------
"""
  
#任何字符,都可以在:
#中,查找到對應的unicode的值
 
def python2xPrintUnicodeStillError():
    slashUStr = "\\u3232\\u6674"#(有) 晴
    decodedUniChars = slashUStr.decode("unicode-escape"); #此處已經可以正常獲得對應的兩個Unicode字符了
    unicodeButContainSpecialChar = decodedUniChars;
    print "unicodeButContainSpecialChar=",unicodeButContainSpecialChar;
     
    #此處在GBK編碼的cmd中輸出的話,會出現錯誤的:
    #UnicodeEncodeError: 'gbk' codec can't encode character u'\u3232' in position 0: illegal multibyte sequence
    #那是因爲,Unicode字符:0x3232,是個特殊字符,而此字符,在GBK編碼字符集中,本身就不包含此特殊字符,所以當然沒法把這個特殊字符編碼爲對應的GBK字符,所以出錯,更無法顯示
 
###############################################################################
if __name__=="__main__":
    python2xPrintUnicodeStillError();

 

原因

上述過程中,雖然已經獲得了正確的unicode字符串了,但是由於此unicode字符串中包含了一個特殊字符,即那個\u3232,對應的字符,顯示出來,像是左右括號中間一個"有"字,即類似於這樣的:

(有)

而此特殊字符,GBK字符集中沒有,不存在,所以無法將對應的Unicode字符,編碼爲對應的GBK字符,所以出現UnicodeEncodeError,更無法打印出來

 

注:

對於任何字符,都可以去這裏:

http://unicodelookup.com/

而查到,對應的unicode的值,html中的寫法。

提醒:

可以通過輸入:

0×3232

而查到該特殊字符。

 

解決辦法

解決辦法,則是不同情況,不同處理:

(1)如果對於這些特殊字符,你不是很關心,即使不顯示也無所謂,但是希望剩下的,其他大多數的正常的字符都能顯示。

即,忽略掉特殊字符,顯示哪些能顯示的字符, 那麼可以改爲如下代碼:

python_2.x_print_unicode_omit_special.py

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Function:
【總結】Python中常見字符編碼和解碼方面的錯誤及其解決辦法
 
 
Author:     Crifan
Verison:    2012-11-29
-------------------------------------------------------------------------------
"""
  
#任何字符,都可以在:
#中,查找到對應的unicode的值
 
def python2xPrintUnicodeOmitSpecial():
    slashUStr = "\\u3232\\u6674"#(有) 晴
    decodedUniChars = slashUStr.decode("unicode-escape"); #此處已經可以正常獲得對應的兩個Unicode字符了
    unicodeButContainSpecialChar = decodedUniChars;
    #print "unicodeButContainSpecialChar=",unicodeButContainSpecialChar;
     
    #此處在GBK編碼的cmd中輸出的話,會出現錯誤的:
    #UnicodeEncodeError: 'gbk' codec can't encode character u'\u3232' in position 0: illegal multibyte sequence
    #那是因爲,Unicode字符:0x3232,是個特殊字符,而此字符,在GBK編碼字符集中,本身就不包含此特殊字符,所以當然沒法把這個特殊字符編碼爲對應的GBK字符,所以出錯,更無法顯示
     
    #如果只是想要:
    #顯示那些正常可以顯示的字符,忽略個別特殊不能顯示的字符
    #那麼可以改爲如下代碼:
    encodedShowableGbk = unicodeButContainSpecialChar.encode("GBK""ignore");
    print "encodedShowableGbk=",encodedShowableGbk; #encodedShowableGbk= 晴
 
###############################################################################
if __name__=="__main__":
    python2xPrintUnicodeOmitSpecial();

 

注:我之前遇到的一個情況,就是通過添加ignore去處理的:

【已解決】UnicodeEncodeError: ‘gbk’ codec can’t encode character u’\u200e’ in position 43: illegal multibyte sequence

 

(2)如果必須要顯示這些字符,或者說必須要保留這些字符。那麼本身對於打印這個需求來說,是可以不打印的,因爲本身已獲得了正常的Unicode字符了。

然後剩下的,只是儘量你自己所需要的後續的處理即可。

即, 已經得到了正確的unicode字符了,後續該咋辦咋辦,可以不打印的時候,就不打印,也就不會出錯了。

 

舉一反三

如果以後遇到這種,雖然已獲得了Unicode字符串,但是還是無法打印等情況,則就要注意去調查一下,是否是由於此處有特殊字符,不存在於輸出目標所用字符集中,才導致此問題的。

 

進一步的舉一反三

如果你對於上述代碼中的encode中的ignore不熟悉,那麼你自然應該想到,去了解,去學習這方面的內容。

然後通過google搜:

unicode encode ignore

就可以找到Python官網的解釋了:

Unicode HOWTO — Python v2.7.3 documentation

而如果你再稍微積極思考的話,就會想到:

既然encode有個ignore參數,那是不是還有其他參數?

對應的函數原型是啥?

由此,去通過Python的自帶手冊,就找到對應你所要的內容了:

str.encode([encoding[, errors]])

Return an encoded version of the string. Default encoding is the current default string encoding. errors may be given to set a different error handling scheme. The default for errors is 'strict', meaning that encoding errors raise a UnicodeError. Other possible values are 'ignore''replace','xmlcharrefreplace''backslashreplace' and any other name registered viacodecs.register_error(), see section Codec Base Classes. For a list of possible encodings, see section Standard Encodings.

New in version 2.0.

Changed in version 2.3: Support for 'xmlcharrefreplace' and'backslashreplace' and other error handling schemes added.

Changed in version 2.7: Support for keyword arguments added.

然後再細心些的話,還會發現手冊中,str.encode上面,還有個對應的decode函數,也是有一些相關的參數,比如’ignore’, ‘replace’的:

str.decode([encoding[, errors]])

Decodes the string using the codec registered for encodingencodingdefaults to the default string encoding. errors may be given to set a different error handling scheme. The default is 'strict', meaning that encoding errors raise UnicodeError. Other possible values are 'ignore','replace' and any other name registered via codecs.register_error(), see section Codec Base Classes.

New in version 2.2.

Changed in version 2.3: Support for other error handling schemes added.

Changed in version 2.7: Support for keyword arguments added.

由此,多去學習官網的手冊,自然會瞭解到,函數的最權威的解釋和用法。

 

總結

凡是都是,要積極思考,通過有限的經驗,去努力獲得更多的,相關知識的總結。

而此處上面的這些總結,相應地,也的確是必須經過一堆的錯誤,從開始的一頭霧水,到最後的漸漸清晰,以及最終的,搞懂邏輯和背後的原因。

總之,想要學好Python或其他語言,都還是要足夠的積累,足夠的練習,以及及時的總結。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章