国产睡熟迷奷白丝护士系列精品,中文色字幕网站,免费h网站在线观看的,亚洲开心激情在线

      <sup id="hb9fh"></sup>
          1. 千鋒教育-做有情懷、有良心、有品質的職業(yè)教育機構

            手機站
            千鋒教育

            千鋒學習站 | 隨時隨地免費學

            千鋒教育

            掃一掃進入千鋒手機站

            領取全套視頻
            千鋒教育

            關注千鋒學習站小程序
            隨時隨地免費學習課程

            當前位置:首頁  >  技術干貨  > 解決Python編碼問題

            解決Python編碼問題

            來源:千鋒教育
            發(fā)布人:xqq
            時間: 2023-11-07 05:13:32 1699305212

            1.基本概念

            字符集(Characterset)

            解釋:文字和符合的總稱

            常見字符集:

            Unicode字符集

            ASCII字符集(Unicode子集)

            GB2312字符集

            編碼方法(Encoding)

            解釋:將字符對應到字節(jié)的方法,部分字符集和編碼方法名稱一樣。

            常見編碼方法:

            UTF-8:可對Unicode字符進行編碼

            GB2312

            ASCII

            編碼(Encode)

            解釋:將字符集中字符按照一定規(guī)則轉換成字節(jié)

            解碼(Decode)

            解釋:與編碼相反,將字節(jié)轉換為字符集中的字符

            字符集與編碼方法的關系

            每個字符集都有對應的編碼方法

            一種字符集可能有多種編碼方法

            不同的編碼方法得到的字節(jié)不同,占用存儲空間也不一樣

            例如Unicode字符可以使用UTF-8/ASCII/GBK等方法編碼

            Unicode字符集包含世界上大部分字符,很多其他字符集有的字符它都有,是他們的超集

            大部分字符集可以理解為Unicode的子集

            實際上,除了Unicode之外所謂的字符集主要是對Unicode部分字符編碼而已(定義編碼方式)

            一種編碼不必支持Unicode的所有字符(通常把它能支持的那部分稱為它的字符集)

            2.關于編碼的錯誤和解決方法

            在開發(fā)過程中,我們所接觸的字符集大多都是Unicode,大部分報錯都是關于編碼和解碼的。

            2.1.編碼錯誤UnicodeEncodeError

            2.1.1.錯誤分析

            導致該錯誤的原因通常是編碼方法支持的Unicode字符不全;在工作中,你寫了一個txt中文文檔,想用ascii編碼去保存這個文件,就會報這種錯誤。

            錯誤復現(xiàn):

            我們知道ascii不支持字符中,那我們用ascii編碼方法對Unicode碼中進行編碼:

            #-*-encoding:utf-8-*-

            u"中".encode(encoding='ascii')

            報錯如下:

            UnicodeEncodeError:'ascii'codeccan'tencodecharacter'\u4e2d'inposition0:ordinalnotinrange(128)

            這是一個UnicodeEncodeError類型的錯誤,提示無法使用指定的編碼方法對字符進行編碼,報錯提示中可以得到3個信息:

            當前使用的是acsii編碼方法

            被編碼的字符是'\u4e2d'

            ascii編碼方法能支持的字符有128個

            有時候我們還可以利用這個提示查看編碼方法支持的字符個數(shù):

            #-*-encoding:utf-8-*-

            u"中".encode(encoding='iso-8859-1')

            報錯:

            UnicodeEncodeError:'latin-1'codeccan'tencodecharacter'\u4e2d'inposition0:ordinalnotinrange(256)

            通過報錯提示可以看出iso-8859-1能編256個字符。

            接著,我們來看下用支持中文的utf-8編碼方法進行編碼能得到什么結果:

            #-*-encoding:utf-8-*-

            s=u"中".encode(encoding='utf-8')

            print("s:",s)

            print("s==中?",s=='中')

            print("typeofs:",type(s))

            print("str==bytes?",bytes==type(s))

            輸出:

            ('s:','\xe4\xb8\xad')

            ('s==\xe4\xb8\xad?',True)

            ('typeofs:',)

            ('str==bytes?',True)

            從輸出的結果可以得到:

            -編碼得到的對象跟我們直接定義的字符串是一樣的,都是str

            -str就是bytes(python中)

            2.1.2.解決方法

            UnicodeEncodeError是說編碼方法支持的字符不全,而UTF-8編碼就能很好地對Unicode編碼,所以只要把編碼方法指定為utf-8就可以了。

            在python2中:

            如果你調(diào)用encode方法但沒有指定encoding參數(shù),那很可能使用了系統(tǒng)默認的參數(shù),就像:

            #-*-encoding:utf-8-*-

            importsys

            print"defaultencodingis%s."%sys.getdefaultencoding()

            u'中'.encode()

            輸出:

            defaultencodingisascii.

            UnicodeEncodeError:'ascii'codeccan'tencodecharacteru'\u4e2d'inposition0:ordinalnotinrange(128)

            可以手動指定encoding參數(shù),也可以修改python默認編碼方法:

            #-*-encoding:utf-8-*-

            importsys

            reload(sys)

            sys.setdefaultencoding('utf-8')#必須在reload之后調(diào)用

            printu'中'.encode()

            在python3中:

            在python3中你很難看到UnicodeEncodeError了,因為python3的默認編碼就是utf-8,而Unicode字符都可以用utf-8編碼方法編碼。

            2.2.編碼錯誤UnicodeDecodeError

            2.2.1.錯誤分析

            導致該錯誤的原因是使用了錯誤的解碼方式把字節(jié)數(shù)據(jù)還原成字符。例如在工作中,有一個utf-8生成中文文檔,我們選擇用ascii編碼解碼,就會報這個錯。

            錯誤復現(xiàn):

            我們知道python中字符串和字節(jié)是一樣,我們可以定義一個中文字符串,通過ascii來解碼生成Unicode,復現(xiàn)這個錯誤:

            #-*-encoding:utf-8-*-

            print'中'.decode(encoding='ascii')

            輸出:

            UnicodeDecodeError:'ascii'codeccan'tdecodebyte0xe4inposition0:ordinalnotinrange(128)

            注意,這是一個UnicodeDecodeError錯誤,區(qū)別于編碼錯誤UnicodeEncodeError,它提示無法把字節(jié)0xe4(實際上中對應三字節(jié),0xe4是第一個)解碼成Unicode。0xe4轉換為10進制是228,已經(jīng)超過127了,所以ascii無能力了。

            2.2.2.解決方法

            我們需要知道生成字節(jié)的編碼方式才能進行還原,就好像對一個文件進行了加密,必須得知道加密的密碼才能把文件還原,而解碼方式(或者稱為編碼)就是那個密碼。所以不管是python2還是python3直接去修改默認編碼為UTF-8不一定能解決問題,具體的方法有兩種:

            通過源碼找到解碼失敗的字節(jié)是使用那種編碼生成的

            對報錯的字節(jié)數(shù)據(jù)使用各種常見的編碼進行解碼,觀察哪一種是正確的

            以一個例子來說明為什么直接設置默認編碼為UTF-8不能有效解決UnicodeDecodeError問題

            python文件頭指定了編碼為,在聲明字符串時候將會使用指定的編碼轉換為字節(jié):

            #-*-encoding:GBK-*-

            s="張"

            print("sis",s)

            s_unicode=u'張'

            print("encodingwithGBKis",s_unicode.encode("GBK"))

            print("encodingwithUTF-8is",s_unicode.encode("UTF-8"))

            輸出:

            ('sis','\xd5\xc5')

            ('encodingwithGBKis','\xd5\xc5')

            ('encodingwithUTF-8is','\xe5\xbc\xa0')

            在文件頭中指定了GBK編碼后默認情況下字符張就會被編碼為\xd5\xc5,這與我們手動用GBK編碼得到結果一致,而使用utf-8編碼得到的是3個字節(jié)的數(shù)據(jù)\xe5\xbc\xa0(使用了更多的存儲空間)。

            例子開始了,在python2中將一個dict轉換成json:

            #-*-encoding:GBK-*-

            importjson

            d={'name':"張",'sex':u'man'}

            print(json.dumps(d))

            輸出:

            UnicodeDecodeError:'utf8'codeccan'tdecodebyte0xd5inposition0:invalidcontinuationbyte

            錯誤說無法使用utf-8解碼0xd5,0xd5也就是GBK中的張,我們知道這個字節(jié)是用GBK生成的,這個時候可以設置json.dumps的encoding參數(shù)解決:

            #-*-encoding:GBK-*-

            importjson

            d={'name':"張",'sex':u'man'}

            print(json.dumps(d,encoding='gbk'))

            修改一下代碼,繼續(xù)使用我們熟悉的utf-8編碼來執(zhí)行:

            #-*-encoding:utf-8-*-

            importjson

            d={'name':"張",'sex':u'man'}

            print(json.dumps(d,encoding='utf-8'))

            輸出:

            {"name":"\u5f20","sex":"man"}

            發(fā)現(xiàn)name是unicode,使用ensure_ascii=False,不強制轉換成ascii:

            #-*-encoding:utf-8-*-

            importjson

            d={'name':"張",'sex':u'man'}

            print(json.dumps(d,encoding='utf-8',ensure_ascii=False))

            輸出:

            File"/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py",line251,indumps

            sort_keys=sort_keys,**kw).encode(obj)

            File"/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py",line210,inencode

            return''.join(chunks)

            UnicodeDecodeError:'ascii'codeccan'tdecodebyte0xe5inposition1:ordinalnotinrange(128)

            納尼,文件頭也是utf-8,也指定了utf-8怎么還是報錯?錯誤提示用ascii去解碼0xe5字節(jié),在上面的代碼輸出中可以知道0xe5是utf-8對字符張編碼的第一個字節(jié),報錯的原因是用ascii去解析utf-8生成的字節(jié)了。我們并沒有設置哪個地方使用ascii解碼,應該是系統(tǒng)默認的編碼,嘗試設置系統(tǒng)默認編碼再執(zhí)行:

            #-*-encoding:utf-8-*-

            importsys

            reload(sys)

            sys.setdefaultencoding('utf-8')

            importjson

            d={'name':"張",'sex':u'man'}

            print(json.dumps(d,encoding='utf-8',ensure_ascii=False))

            輸出:

            {"name":"張","sex":"man"}

            3.總結

            3.1.python2和python3對字符串的處理區(qū)別

            Python2

            默認編碼是ascii

            Python3

            importsys;sys.setdefaultencoding('utf-8')

            3.2.為什么不全用UTF-8編碼?

            UTF-8包含的字符更多,占用的內(nèi)存和磁盤空間也更大,比如對漢字張,utf-8是3個字節(jié),gbk是2個字節(jié)。

            3.3.如何快速解決UnicodeEncodeError錯誤?

            python3中基本不會出現(xiàn),python2中嘗試設置默認編碼為utf-8。

            3.4.快速解決UnicodeDecodeError?

            需要知道出錯的字節(jié)是使用哪種編碼方式生成的,然后嘗試把默認編碼設置成這種。

            以上內(nèi)容為大家介紹了解決Python編碼問題,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。http://www.parentadvocate.org/

            tags: python培訓
            聲明:本站稿件版權均屬千鋒教育所有,未經(jīng)許可不得擅自轉載。
            10年以上業(yè)內(nèi)強師集結,手把手帶你蛻變精英
            請您保持通訊暢通,專屬學習老師24小時內(nèi)將與您1V1溝通
            免費領取
            今日已有369人領取成功
            劉同學 138****2860 剛剛成功領取
            王同學 131****2015 剛剛成功領取
            張同學 133****4652 剛剛成功領取
            李同學 135****8607 剛剛成功領取
            楊同學 132****5667 剛剛成功領取
            岳同學 134****6652 剛剛成功領取
            梁同學 157****2950 剛剛成功領取
            劉同學 189****1015 剛剛成功領取
            張同學 155****4678 剛剛成功領取
            鄒同學 139****2907 剛剛成功領取
            董同學 138****2867 剛剛成功領取
            周同學 136****3602 剛剛成功領取
            相關推薦HOT