python2发送http不编码_[转]Python 2.x中常见字符编码和解码方面的错误及其解决办法...
Python 2.x中的字符編碼,設(shè)計(jì)的的確不好,導(dǎo)致初學(xué)者,甚至是即使用Python很長時(shí)間的人,都會經(jīng)常遇到字符編解碼方面的錯(cuò)誤。
下面就把一些常見情,盡量的都整理出來,并給出相應(yīng)的解決辦法。
看此文之前
Python中字符編碼所涉及的背后邏輯(從你輸入字符,到終端顯示字符的背后過程)
在去了解Python編碼解碼之前,還有個(gè)更加重要,但是很多時(shí)候卻被其他解釋相關(guān)知識的人所忽略的問題,那就是:
對于Python中字符串,輸入輸出的背后邏輯。
即,知其所以然。
此處就簡單介紹一下,在Python中,從你所輸入的字符串,到顯示出字符串,這背后的過程是什么樣的。
只有了解了這個(gè)大概的過程,和背后的邏輯,你才能真正理解后面的所解釋的,字符串編碼解碼方面的錯(cuò)誤,以及如何解決這樣的錯(cuò)誤。
對于你
你只是看到的是:
你輸入了字符串
不論是從Python的IDLE中輸入的
還是寫入到Python文件中的
然后你去運(yùn)行的對應(yīng)代碼,該P(yáng)ython代碼,經(jīng)過Python系統(tǒng),(此處及之后,我稱其為Python解析器),的處理
使得你可以看到最終所輸出的字符串
不論是在Python的IDLE中看到的
還是在windows的cmd中看到的。
對于Python解析器
而Python解析器所干的事情,就是:
Python解析器,根據(jù)當(dāng)前的所用的字符串編碼類型
此字符串編碼類型,是你自己所設(shè)置的
不論是在Python的IDLE中,還是Python文件中
都是你自己顯示指定對應(yīng)的編碼類型的
當(dāng)然你沒顯示的指定的話,那就用默認(rèn)的配置
如果是Python的IDLE,如果你沒修改defaultencoding,那么就使用默認(rèn)的字符編碼
可以通過sys.getdefaultencoding()而獲得,比如此處獲得是:ascii
此處插入圖片
ascii
如果是Python文件,如果你沒聲明文件編碼,則使用默認(rèn)的編碼:UTF-8
常見的做法是指定為對應(yīng)的UTF-8類型:# -- coding: utf-8 --
相關(guān)內(nèi)容,不了解的可參考:【整理】關(guān)于Python腳本開頭兩行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件編碼類型
去執(zhí)行你的Python代碼
其中,很常見的幾種動作是:
打印print對應(yīng)的所獲得的字符
對于字符串打印,Python的邏輯:
如果是Unicode字符串,則可以,自動地,編碼為對應(yīng)的終端所用編碼,然后正確的顯示出來
比如unicode的字符串,輸出到windows的默認(rèn)編碼為GBK的cmd中,則Python可以自動將Unicode編碼為GBK,然后輸出到cmd中
個(gè)別特殊情況,也會出錯(cuò):
當(dāng)此unicode字符串中包含某特殊字符,而目標(biāo)終端的編碼集合中,沒有此字符,則很明顯也是無法實(shí)現(xiàn)將Unicode編碼為對應(yīng)的特定編碼的字符串,無法正確顯示的
如果是某種編碼類型的str,則需要該str的編碼類型,和目標(biāo)終端編碼匹配
比如GBK的字符串,輸出到windows的默認(rèn)編碼為GBK的cmd,則是可以正常輸出的
此處后來經(jīng)過代碼測試,就發(fā)現(xiàn)一個(gè)有趣或者說詭異的問題,雖然我們python文件聲明的UTF-8編碼,但是實(shí)際上實(shí)際上是用GBK編碼,而此時(shí),文件中的字符串,很明顯是用GBK存儲的,所以,將此GBK字符,輸出到GBK的cmd中,是可以正常輸出的。即,此處字符串的類型,很明顯只和文件所用的實(shí)際編碼有關(guān),而和文件所聲明的代碼無關(guān)。
如果是UTF-8的字符串,輸出到windows的默認(rèn)編碼為GBK的cmd,就會出錯(cuò)
對相應(yīng)的字符,進(jìn)行編碼(為某種特定類型的字符str),或解碼(為對應(yīng)的unicode類型的字符)
比如將當(dāng)前的某種編碼的字符串,解碼為Unicode字符串
很明顯,也是要保證,你字符串本身的編碼和所指定的編碼,兩者之間要一致的
比如:decodedUnicode = someUtf8Str.decode("UTF-8")
而如果用這樣的:decodedUnicode = someGbkStr.decode("UTF-8"),那就會出現(xiàn)錯(cuò)誤
所以你要
確保當(dāng)前輸入的字符串的編碼,和對應(yīng)的編碼設(shè)置一致,才能使得解析器正常解析你的字符串
確保輸出字符串時(shí),所用字符(的編碼)和目標(biāo)輸出所用的編碼一致,才能正常在輸出終端顯示
確保字符串本身的編碼,和你去解碼等操作所用的編碼一致,否則很明顯會由于編碼不一致而無法進(jìn)行解碼(等操作)
常見錯(cuò)誤簡介
很明顯,如果你不遵守上述規(guī)則,出現(xiàn)前面編碼不一致的情況,那么就會出現(xiàn)一些常見的編碼解碼方面的錯(cuò)誤了。
此處只是簡單舉例如下:
你python文件本身是GBK的,對應(yīng)的字符串也是GBK的,然后你指定按照UTF-8解碼為對應(yīng)的Unicode,那么當(dāng)然會導(dǎo)致人家Python解析器,按照UTF-8編碼的方式,去解析你的,實(shí)際上是GBK的字符,當(dāng)然會出錯(cuò),無法解析了。
你所要打印的字符,本身是UTF-8的,但是要打印輸出的終端是,windows的cmd,其默認(rèn)編碼為GBK,即將UTF-8的字符,顯示到GBK編碼的cmd中,當(dāng)然也會出現(xiàn)錯(cuò)誤了
你所要打印出來的字符,雖然是unicode,但是其中包含了某些特殊字符,而對應(yīng)的特殊字符在終端所用的編碼中不存在,比如將含某些特殊字符的Unicode字符串,打印到windows的默認(rèn)編碼為GBK的cmd中,而GBK編碼集合中,本身就沒有這些字符,所以,當(dāng)然也是無法顯示,會出現(xiàn)對應(yīng)的UnicodeEncodeError的錯(cuò)誤的。
所以,諸如此類的問題,如果搞懂了之前的邏輯,那么自然很容易理解其錯(cuò)誤的根源,并找到解決辦法。
即,知其所以然,之后,更容易,知其然。
下面就來,故意的:
再現(xiàn),出各種Python 2.x中所常見的字符的編碼解碼等方面的錯(cuò)誤;
然后幫你找到問題的根本原因;
進(jìn)而找到問題所對應(yīng)的解決辦法;
Python 2.x的字符編碼本身的設(shè)計(jì)的邏輯:str和unicode
想要了解Python 2.x中,字符串編解碼的問題和原因,首先搞懂Python 2.x中在字符串的方面是如何設(shè)計(jì)的,其主要分兩大類:str和unicode。
對于str和unicode的確切含義,以及如何互相轉(zhuǎn)換,以及Python 2.x和Python 3.x中的bytes和str,有何區(qū)別等內(nèi)容
之前已經(jīng)詳盡的總結(jié)了:
不了解的,也是需要去看懂,然后才能真正明白下面的問題的原因的。
Python中常見字符的編碼和解碼方面的錯(cuò)誤的現(xiàn)象,原因,及其解決辦法
提醒:
1.下面的代碼,如果想要拷貝粘貼到文件中去測試的話,請注意文本本身所用編碼。
未必一定是聲明的那個(gè)編碼;
詳情請自己看代碼中的中文說明。
不過最簡單的是,直接右鍵另存為對應(yīng)的python文件,省去你拷貝粘貼轉(zhuǎn)碼等煩心事了。
2.關(guān)于代碼編輯器,推薦用Notepad++:
3.其中對于文件轉(zhuǎn)換編碼等事宜,不了解的可以參考:
Python中,想要將某字符串解碼為對應(yīng)的Unicode,但是所使用的編碼類型和字符串本身的編碼不匹配
現(xiàn)象
字符串本身,是某種編碼類型的字符串,但是結(jié)果將其解碼為對應(yīng)的Unicode時(shí),卻指定了另外一種編碼類型,導(dǎo)致無法正常的解碼為對應(yīng)的Unicode,而出現(xiàn)UnicodeDecodeError之類的錯(cuò)誤。
比如用UTF-8去解碼GBK的字符串:
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Function:
【總結(jié)】Python中常見字符編碼和解碼方面的錯(cuò)誤及其解決辦法
http://www.crifan.com/summary_python_2_x_common_string_encode_decode_error_reason_and_solution
Author: Crifan
Verison: 2012-11-29
-------------------------------------------------------------------------------
"""
def python2xDecodeGbkWithUtf8():
zhcnActualGbk = "此處你所看到的中文字符所處的環(huán)境是:\r\n1.當(dāng)前文件用聲明的編碼是UTF-8。但是后來經(jīng)過證明,此處實(shí)際上聲明為GBK還是UTF-8,對于字符串本身的編碼,沒影響。字符串本身的編碼,之和當(dāng)前文件的編碼有關(guān);\r\n2.此處實(shí)際上文件本身卻是用的GBK編碼,所以你看到的當(dāng)前的字符串也是GBK的。所以,后面要演示的:\r\n3.對于GBK的字符,指定用UTF-8方式去解碼,則會出錯(cuò)。\r\n4.但是由于當(dāng)前字符是GBK的,而后面要print打印出來到Windows的cmd中,其中cmd編碼(默認(rèn))為GBK,所以,print函數(shù)是,不會出錯(cuò),可以正確顯示此處中文字符的";
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; #上述解碼出錯(cuò),更不可能執(zhí)行到這里的print了
###############################################################################
if __name__=="__main__":
python2xDecodeGbkWithUtf8();
要說明的是,此處是,只是為了代碼演示,所以很明顯,就直接看出錯(cuò)誤了。
但是實(shí)際的編程過程中,由于很多時(shí)候情況很復(fù)雜,未必立刻會意識到或注意到,編碼類型弄錯(cuò)了,所以,也還是需要注意這種情況的。
原因
如上所述,想要把某種編碼的字符串解碼為Unicode;
字符串是A編碼的(GBK),但是卻用B編碼(UTF-8)去解碼,導(dǎo)致出現(xiàn)UnicodeDecodeError錯(cuò)誤;
解決辦法
使用和字符串本身編碼相同的編碼,去解碼,就可以正常的解碼為Unicode了。
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Function:
【總結(jié)】Python中常見字符編碼和解碼方面的錯(cuò)誤及其解決辦法
http://www.crifan.com/summary_python_2_x_common_string_encode_decode_error_reason_and_solution
Author: Crifan
Verison: 2012-11-29
-------------------------------------------------------------------------------
"""
def python2xDecodeGbkWithGbk():
zhcnActualGbk = "此處你所看到的中文字符所處的環(huán)境是:\r\n1.當(dāng)前文件用聲明的編碼是UTF-8。但是后來經(jīng)過證明,此處實(shí)際上聲明為GBK還是UTF-8,對于字符串本身的編碼,沒影響。字符串本身的編碼,之和當(dāng)前文件的編碼有關(guān);\r\n2.此處實(shí)際上文件本身卻是用的GBK編碼,所以你看到的當(dāng)前的字符串也是GBK的。所以,后面要演示的:\r\n3.對于GBK的字符,使用同樣的GBK去解碼,則不會出錯(cuò)了。\r\n4.而解碼后得到的Unicode字符串,也可以正常在Windows的默認(rèn)編碼為GBK的cmd中顯示了。其中,內(nèi)部會自動將Unicode編碼為GBK然后送到cmd中顯示的。";
print "zhcnActualGbk=",zhcnActualGbk; #此處是可以正常打印出上述中文字符的
zhcnUnicode = zhcnActualGbk.decode("GBK"); #此處使用和字符串本身一致的GBK解碼,就可以正常解碼為Unicode了
print "zhcnUnicode=",zhcnUnicode; #此處就可以正常輸出Unicode字符串了。內(nèi)部會自動將Unicode編碼為GBK,然后送到cmd中顯示的
###############################################################################
if __name__=="__main__":
python2xDecodeGbkWithGbk();
舉一反三
如果你以后遇到類似的,UnicodeDecodeError,那么說明是Unicode在解碼方面的錯(cuò)誤,肯定是將某種編碼的字符串,解碼為Unicode的過程中,出現(xiàn)的錯(cuò)誤。
而錯(cuò)誤原因,也往往都是編碼類型不匹配,然后就可以去檢查一下,是不是字符串本身的編碼,和你在調(diào)用decode時(shí)所設(shè)置的編碼不匹配。
Python中,打印字符串時(shí),字符串本身的編碼,與輸出終端中所用編碼不匹配
現(xiàn)象
字符串本身,是某種編碼的,但是輸出,顯示,到終端時(shí),終端所使用編碼,和你字符串的編碼不一樣,導(dǎo)致無法正常顯示。
比較常見的是,本身是UTF-8類型的字符串,但是卻將其輸出到Windows的cmd中,而cmd中默認(rèn)是GBK編碼的,導(dǎo)致兩者不匹配,所以打印字符串時(shí),出現(xiàn)亂碼:
python_2.x_print_utf8_to_gbk.py
#!/usr/bin/python
# -- coding: utf-8 --
"""
-------------------------------------------------------------------------------
Function:
【總結(jié)】Python中常見字符編碼和解碼方面的錯(cuò)誤及其解決辦法
http://www.crifan.com/summary_python_2_x_common_string_encode_decode_error_reason_and_solution
Author: Crifan
Verison:2012-11-29
-------------------------------------------------------------------------------
"""
def python2xPrintUtf8ToGbk():
zhcnUtf8 = "此處你所看到的中文字符所處的環(huán)境是:\r\n1.當(dāng)前文件用聲明的編碼是UTF-8。但是后來經(jīng)過證明,此處實(shí)際上聲明為GBK還是UTF-8,對于字符串本身的編碼,沒影響。字符串本身的編碼,只和當(dāng)前文件的編碼有關(guān);\r\n2.不過呢,此處文件本身的編碼的確是UTF-8的,所以你看到的當(dāng)前的字符串也是UTF-8編碼的。所以,后面要演示的:\r\n3.對于UTF-8的字符,去打印輸出到Windows的默認(rèn)編碼為GBK的cmd中,就會出現(xiàn)亂碼錯(cuò)了。";
print "zhcnUtf8=",zhcnUtf8; #把UTF-8的字符串,輸出到GBK的cmd中,結(jié)果顯示的都是亂碼:
# zhcnUtf8= 姝ゅ浣犳墍鐪嬪埌鐨勪腑鏂囧瓧絎︽墍澶勭殑鐜鏄細(xì)
# 1.褰撳墠鏂囦歡鐢ㄥ0鏄庣殑緙栫爜鏄疷TF-8銆備絾鏄悗鏉ョ粡榪囪瘉鏄庯紝姝ゅ瀹為檯涓婂0鏄庝負(fù)GBK榪樻槸UTF-8錛屽浜庡瓧絎︿覆鏈韓鐨勭紪鐮侊紝娌″獎鍝嶃€傚瓧絎︿覆鏈韓鐨勭紪鐮侊紝鍙拰褰撳墠鏂囦
# 歡鐨勭紪鐮佹湁鍏籌紱
# 2.涓嶈繃鍛紝姝ゅ鏂囦歡鏈韓鐨勭紪鐮佺殑紜槸UTF-8鐨勶紝鎵€浠ヤ綘鐪嬪埌鐨勫綋鍓嶇殑瀛楃涓蹭篃鏄疷TF-8緙栫爜鐨勩€傛墍浠ワ紝鍚庨潰瑕佹紨紺虹殑錛?
# 3.瀵逛簬UTF-8鐨勫瓧絎︼紝鍘繪墦鍗拌緭鍑哄埌Windows鐨勯粯璁ょ紪鐮佷負(fù)GBK鐨刢md涓紝灝變細(xì)鍑洪敊浜嗐€
###############################################################################
if __name__=="__main__":
python2xPrintUtf8ToGbk();
原因
把Python文件中的字符串,該P(yáng)ython文件是UTF-8的,所以該字符串也是UTF-8編碼的,輸出到Windows的cmd中,而cmd中默認(rèn)編碼為GBK,即
把UTF-8的字符串,在GBK的cmd上顯示,則出現(xiàn)了亂碼。
解決辦法
目的是為了是要輸出的字符串的編碼,是Unicode,或者和目標(biāo)輸出終端的編碼一致,就可以正常輸出了。
所以可以把UTF-8的字符,解碼為對應(yīng)的Unicode,。
(也可以進(jìn)一步的,把Unicode字符串,編碼為GBK)
然后再輸出到GBK的cmd中,就可以正常顯示,不是亂碼了:
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Function:
【總結(jié)】Python中常見字符編碼和解碼方面的錯(cuò)誤及其解決辦法
http://www.crifan.com/summary_python_2_x_common_string_encode_decode_error_reason_and_solution
Author: Crifan
Verison:2012-11-29
-------------------------------------------------------------------------------
"""
def python2xDecodeUtf8ThenOutputToGbk():
zhcnUtf8 = "此處你所看到的中文字符所處的環(huán)境是:\r\n1.當(dāng)前文件用聲明的編碼是UTF-8。但是后來經(jīng)過證明,此處實(shí)際上聲明為GBK還是UTF-8,對于字符串本身的編碼,沒影響。字符串本身的編碼,只和當(dāng)前文件的編碼有關(guān);\r\n2.不過呢,此處文件本身的編碼的確是UTF-8的,所以你看到的當(dāng)前的字符串也是UTF-8編碼的。所以,后面要演示的:\r\n3.對于UTF-8的字符,先去指定用UTF-8去解碼為Unicode,然后再去輸出到Windows的默認(rèn)編碼為GBK的cmd中,就不會出現(xiàn)亂碼錯(cuò)了。或者是將得到的Unicode字符串,再編碼為GBK,然后再輸出到GBK的cmd,也是同樣的效果。";
print "zhcnUtf8=",zhcnUtf8; #把UTF-8的字符串,輸出到GBK的cmd中,結(jié)果顯示的都是亂碼:
# zhcnUtf8= 姝ゅ浣犳墍鐪嬪埌鐨勪腑鏂囧瓧絎︽墍澶勭殑鐜鏄細(xì) ......紝灝變細(xì)鍑洪敊浜嗐€
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();
舉一反三
以后如果再遇到類似的亂碼,先去確定你的字符串本身是什么編碼的。
再去確定,你所要輸出的終端目標(biāo)中,所用的編碼是什么樣的。
其中,輸出的終端,此處舉例所用的是,windows的cmd,其他還有可能是輸出內(nèi)容到文件中,其中還涉及文件所用的編碼是什么,這些都要自己搞清楚的。
總之,確保字符串編碼類型,和輸出所用的編碼類型,兩者是一致的,就不會出現(xiàn)亂碼了。
Python中,打印含某些特殊字符的Unicode類型字符串,但是輸出終端中字符編碼集中不包含這些特殊字符
現(xiàn)象
雖然已經(jīng)獲得了Unicode的字符串了,但是當(dāng)打印Unicode類型的字符串,到某些終端中時(shí),結(jié)果卻還是出錯(cuò)了。
比如,下面的例子中,就是把Unicode字符串,打印到Windows的cmd中,結(jié)果出錯(cuò):
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Function:
【總結(jié)】Python中常見字符編碼和解碼方面的錯(cuò)誤及其解決辦法
http://www.crifan.com/summary_python_2_x_common_string_encode_decode_error_reason_and_solution
Author: Crifan
Verison:2012-11-29
-------------------------------------------------------------------------------
"""
#任何字符,都可以在:
#http://unicodelookup.com/
#中,查找到對應(yīng)的unicode的值
def python2xPrintUnicodeStillError():
#http://zhidao.baidu.com/question/500133781.html
slashUStr = "\\u3232\\u6674"; #(有) 晴
decodedUniChars = slashUStr.decode("unicode-escape"); #此處已經(jīng)可以正常獲得對應(yīng)的兩個(gè)Unicode字符了
unicodeButContainSpecialChar = decodedUniChars;
print "unicodeButContainSpecialChar=",unicodeButContainSpecialChar;
#此處在GBK編碼的cmd中輸出的話,會出現(xiàn)錯(cuò)誤的:
#UnicodeEncodeError: 'gbk' codec can't encode character u'\u3232' in position 0: illegal multibyte sequence
#那是因?yàn)?#xff0c;Unicode字符:0x3232,是個(gè)特殊字符,而此字符,在GBK編碼字符集中,本身就不包含此特殊字符,所以當(dāng)然沒法把這個(gè)特殊字符編碼為對應(yīng)的GBK字符,所以出錯(cuò),更無法顯示
###############################################################################
if __name__=="__main__":
python2xPrintUnicodeStillError();
原因
上述過程中,雖然已經(jīng)獲得了正確的unicode字符串了,但是由于此unicode字符串中包含了一個(gè)特殊字符,即那個(gè)\u3232,對應(yīng)的字符,顯示出來,像是左右括號中間一個(gè)"有"字,即類似于這樣的:
(有)
而此特殊字符,GBK字符集中沒有,不存在,所以無法將對應(yīng)的Unicode字符,編碼為對應(yīng)的GBK字符,所以出現(xiàn)UnicodeEncodeError,更無法打印出來
注:
對于任何字符,都可以去這里:
而查到,對應(yīng)的unicode的值,html中的寫法。
提醒:
可以通過輸入:
0x3232
而查到該特殊字符。
解決辦法
解決辦法,則是不同情況,不同處理:
(1)如果對于這些特殊字符,你不是很關(guān)心,即使不顯示也無所謂,但是希望剩下的,其他大多數(shù)的正常的字符都能顯示。
即,忽略掉特殊字符,顯示哪些能顯示的字符, 那么可以改為如下代碼:
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Function:
【總結(jié)】Python中常見字符編碼和解碼方面的錯(cuò)誤及其解決辦法
http://www.crifan.com/summary_python_2_x_common_string_encode_decode_error_reason_and_solution
Author: Crifan
Verison:2012-11-29
-------------------------------------------------------------------------------
"""
#任何字符,都可以在:
#http://unicodelookup.com/
#中,查找到對應(yīng)的unicode的值
def python2xPrintUnicodeOmitSpecial():
#http://zhidao.baidu.com/question/500133781.html
slashUStr = "\\u3232\\u6674"; #(有) 晴
decodedUniChars = slashUStr.decode("unicode-escape"); #此處已經(jīng)可以正常獲得對應(yīng)的兩個(gè)Unicode字符了
unicodeButContainSpecialChar = decodedUniChars;
#print "unicodeButContainSpecialChar=",unicodeButContainSpecialChar;
#此處在GBK編碼的cmd中輸出的話,會出現(xiàn)錯(cuò)誤的:
#UnicodeEncodeError: 'gbk' codec can't encode character u'\u3232' in position 0: illegal multibyte sequence
#那是因?yàn)?#xff0c;Unicode字符:0x3232,是個(gè)特殊字符,而此字符,在GBK編碼字符集中,本身就不包含此特殊字符,所以當(dāng)然沒法把這個(gè)特殊字符編碼為對應(yīng)的GBK字符,所以出錯(cuò),更無法顯示
#如果只是想要:
#顯示那些正??梢燥@示的字符,忽略個(gè)別特殊不能顯示的字符
#那么可以改為如下代碼:
encodedShowableGbk = unicodeButContainSpecialChar.encode("GBK", "ignore");
print "encodedShowableGbk=",encodedShowableGbk; #encodedShowableGbk= 晴
###############################################################################
if __name__=="__main__":
python2xPrintUnicodeOmitSpecial();
注:我之前遇到的一個(gè)情況,就是通過添加ignore去處理的:
(2)如果必須要顯示這些字符,或者說必須要保留這些字符。那么本身對于打印這個(gè)需求來說,是可以不打印的,因?yàn)楸旧硪勋@得了正常的Unicode字符了。
然后剩下的,只是盡量你自己所需要的后續(xù)的處理即可。
即, 已經(jīng)得到了正確的unicode字符了,后續(xù)該咋辦咋辦,可以不打印的時(shí)候,就不打印,也就不會出錯(cuò)了。
舉一反三
如果以后遇到這種,雖然已獲得了Unicode字符串,但是還是無法打印等情況,則就要注意去調(diào)查一下,是否是由于此處有特殊字符,不存在于輸出目標(biāo)所用字符集中,才導(dǎo)致此問題的。
進(jìn)一步的舉一反三
如果你對于上述代碼中的encode中的ignore不熟悉,那么你自然應(yīng)該想到,去了解,去學(xué)習(xí)這方面的內(nèi)容。
然后通過google搜:
unicode encode ignore
而如果你再稍微積極思考的話,就會想到:
既然encode有個(gè)ignore參數(shù),那是不是還有其他參數(shù)?
對應(yīng)的函數(shù)原型是啥?
由此,去通過Python的自帶手冊,就找到對應(yīng)你所要的內(nèi)容了:
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 via codecs.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.
然后再細(xì)心些的話,還會發(fā)現(xiàn)手冊中,str.encode上面,還有個(gè)對應(yīng)的decode函數(shù),也是有一些相關(guān)的參數(shù),比如’ignore’, ‘replace’的:
str.decode([encoding[, errors]])
Decodes the string using the codec registered for encoding. encoding defaults 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.
由此,多去學(xué)習(xí)官網(wǎng)的手冊,自然會了解到,函數(shù)的最權(quán)威的解釋和用法。
總結(jié)
凡是都是,要積極思考,通過有限的經(jīng)驗(yàn),去努力獲得更多的,相關(guān)知識的總結(jié)。
而此處上面的這些總結(jié),相應(yīng)地,也的確是必須經(jīng)過一堆的錯(cuò)誤,從開始的一頭霧水,到最后的漸漸清晰,以及最終的,搞懂邏輯和背后的原因。
總之,想要學(xué)好Python或其他語言,都還是要足夠的積累,足夠的練習(xí),以及及時(shí)的總結(jié)。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的python2发送http不编码_[转]Python 2.x中常见字符编码和解码方面的错误及其解决办法...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件项目管理(四)
- 下一篇: robocode java_如何建造你的