黄视频网站在线免费观看-黄视频网站在线看-黄视频网站在线观看-黄视频网站免费看-黄视频网站免费观看-黄视频网站免费

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

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

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

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

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

解決Python編碼問題

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

1.基本概念

字符集(Characterset)

解釋:文字和符合的總稱

常見字符集:

Unicode字符集

ASCII字符集(Unicode子集)

GB2312字符集

編碼方法(Encoding)

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

常見編碼方法:

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

GB2312

ASCII

編碼(Encode)

解釋:將字符集中字符按照一定規則轉換成字節

解碼(Decode)

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

字符集與編碼方法的關系

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

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

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

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

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

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

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

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

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

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

2.1.編碼錯誤UnicodeEncodeError

2.1.1.錯誤分析

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

錯誤復現:

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

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

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

報錯如下:

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

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

當前使用的是acsii編碼方法

被編碼的字符是'\u4e2d'

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

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

#-*-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中:

如果你調用encode方法但沒有指定encoding參數,那很可能使用了系統默認的參數,就像:

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

importsys

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

u'中'.encode()

輸出:

defaultencodingisascii.

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

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

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

importsys

reload(sys)

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

printu'中'.encode()

在python3中:

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

2.2.編碼錯誤UnicodeDecodeError

2.2.1.錯誤分析

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

錯誤復現:

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

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

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

輸出:

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

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

2.2.2.解決方法

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

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

對報錯的字節數據使用各種常見的編碼進行解碼,觀察哪一種是正確的

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

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

#-*-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個字節的數據\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中的張,我們知道這個字節是用GBK生成的,這個時候可以設置json.dumps的encoding參數解決:

#-*-encoding:GBK-*-

importjson

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

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

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

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

importjson

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

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

輸出:

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

發現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字節,在上面的代碼輸出中可以知道0xe5是utf-8對字符張編碼的第一個字節,報錯的原因是用ascii去解析utf-8生成的字節了。我們并沒有設置哪個地方使用ascii解碼,應該是系統默認的編碼,嘗試設置系統默認編碼再執行:

#-*-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對字符串的處理區別

Python2

默認編碼是ascii

Python3

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

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

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

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

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

3.4.快速解決UnicodeDecodeError?

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

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

tags: python培訓
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您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
午夜激情视频在线播放| 韩国三级视频在线观看| 国产亚洲精品aaa大片| 四虎久久影院| 日韩免费片| 国产一区二区精品| 91麻豆国产级在线| 久久精品成人一区二区三区| 夜夜操天天爽| 日韩中文字幕在线观看视频| 成人a大片在线观看| 精品国产一区二区三区免费| 你懂的福利视频| 毛片高清| 成人影视在线播放| 黄色免费网站在线| 一本伊大人香蕉高清在线观看| 成人免费一级毛片在线播放视频| 久久久久久久免费视频| 色综合久久手机在线| 国产极品精频在线观看| 高清一级做a爱过程不卡视频| 亚洲天堂免费观看| 夜夜操天天爽| 亚洲 男人 天堂| 国产伦精品一区二区三区无广告 | 日韩专区第一页| 天堂网中文字幕| 黄色福利片| 二级特黄绝大片免费视频大片| 九九久久国产精品| 精品国产一区二区三区久 | 四虎影视库| 国产综合91天堂亚洲国产| 成人a级高清视频在线观看| 日韩中文字幕一区| 成人影视在线观看| 香蕉视频三级| 成人免费观看视频| 欧美1区| 久久精品免视看国产成人2021| 欧美激情一区二区三区中文字幕| 韩国毛片基地| 日韩中文字幕一区| 免费一级片在线| 毛片高清| 高清一级做a爱过程不卡视频| 国产91精品一区| 色综合久久天天综线观看| 91麻豆高清国产在线播放| 天堂网中文在线| 国产视频久久久久| 国产成人女人在线视频观看 | 日韩在线观看视频网站| 一级女性全黄生活片免费| 国产麻豆精品免费视频| 精品视频一区二区| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 精品久久久久久免费影院| 黄视频网站在线看| 久久99中文字幕久久| 日本伦理片网站| 色综合久久天天综合绕观看| 青青久久国产成人免费网站| 成人高清视频免费观看| 欧美国产日韩一区二区三区| 成人免费观看视频| 亚洲第一色在线| 国产成人精品影视| 成人影院久久久久久影院| 国产极品白嫩美女在线观看看| 韩国毛片免费大片| 91麻豆国产| 九九久久国产精品| 韩国毛片免费大片| 韩国三级香港三级日本三级la| 久久99这里只有精品国产| 欧美激情伊人| 国产伦久视频免费观看 视频| 免费的黄色小视频| 日日夜夜婷婷| 九九久久99| 国产不卡高清| 成人av在线播放| 国产国语对白一级毛片| 国产成人啪精品| 中文字幕一区二区三区精彩视频 | 精品久久久久久综合网| 国产一区二区精品久久| 日韩在线观看视频免费| 一级女性全黄久久生活片| 国产不卡在线观看视频| 九九久久国产精品大片| 超级乱淫黄漫画免费| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 免费一级生活片| 日韩av东京社区男人的天堂| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 欧美1区| 亚洲 国产精品 日韩| 一本伊大人香蕉高清在线观看| 成人影院久久久久久影院| 久草免费在线视频| 国产一区二区精品在线观看| 可以免费看毛片的网站| 久久精品大片| 91麻豆精品国产自产在线| 精品视频免费在线| 亚欧乱色一区二区三区| 国产高清在线精品一区二区| 香蕉视频久久| 免费一级生活片| 久久久久久久免费视频| 成人高清视频免费观看| 国产视频一区在线| 欧美爱爱网| 国产欧美精品午夜在线播放| 国产综合91天堂亚洲国产| 欧美α片无限看在线观看免费| 久草免费在线色站| 午夜激情视频在线播放| 国产不卡高清| 九九久久99| 精品国产香蕉在线播出| 日韩专区一区| 久久国产一久久高清| 国产伦久视频免费观看 视频| 欧美激情一区二区三区视频| 一 级 黄 中国色 片| 亚洲精品中文字幕久久久久久| 99久久精品费精品国产一区二区| 成人a大片高清在线观看| 麻豆污视频| 你懂的在线观看视频| 国产91素人搭讪系列天堂| 亚洲天堂一区二区三区四区| 欧美1卡一卡二卡三新区| 欧美大片一区| 午夜久久网| 国产一级强片在线观看| 999久久66久6只有精品| 青青久久精品| 国产伦精品一区二区三区在线观看| 国产高清在线精品一区二区| 国产成人精品综合| 久久国产一久久高清| 国产福利免费视频| 亚欧乱色一区二区三区| 久草免费在线视频| 国产亚洲精品成人a在线| 国产a毛片| 一本高清在线| 欧美激情一区二区三区在线 | 免费国产一级特黄aa大片在线| 天天色色色| 欧美a级大片| 日韩在线观看免费| 国产伦精品一区二区三区在线观看| 成人影院久久久久久影院| 深夜做爰性大片中文| 国产韩国精品一区二区三区| 精品国产亚洲一区二区三区| 91麻豆精品国产片在线观看| 人人干人人草| 精品国产一区二区三区国产馆| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 四虎影视精品永久免费网站 | 韩国毛片 免费| 日本特黄特黄aaaaa大片| 一级毛片看真人在线视频| 亚洲第一页色| 欧美激情一区二区三区在线 | 亚洲天堂免费| 国产美女在线一区二区三区| 日韩在线观看视频免费| 成人免费观看网欧美片| 欧美日本免费| 青青青草影院| 精品国产亚洲人成在线| 毛片电影网| 91麻豆国产| 色综合久久天天综合观看| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 午夜在线影院| 二级特黄绝大片免费视频大片| 欧美激情伊人| 美国一区二区三区| 精品视频在线观看视频免费视频| 精品久久久久久中文字幕一区| 九九精品在线播放| 成人高清视频免费观看| 精品视频免费在线| 超级乱淫伦动漫| 日韩中文字幕在线播放| 国产一区二区精品在线观看| 欧美国产日韩久久久| 国产视频一区二区在线播放| 可以免费在线看黄的网站| 精品国产一区二区三区久| 欧美a免费|