最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中的編碼知識整理匯總

 更新時間:2016年01月26日 11:53:15   投稿:hebedich  
這篇文章主要介紹了python中的編碼知識整理匯總的相關(guān)資料,需要的朋友可以參考下

問題

在平時工作中,遇到了這樣的錯誤:

UnicodeDecodeError: 'ascii' codec can't decode byte

想必大家也都碰到過,很常見 。于是決定對python的編碼做一個整理和學(xué)習(xí)。

基礎(chǔ)知識

在python2.x中,有兩種數(shù)據(jù)類型,unicode和str,這兩個都是basestring的子類

>>> a = '中'
>>> type(a)
<type 'str'>
>>> isinstance(a,basestring)
True
>>> a = u'中'
>>> type(a)
<type 'unicode'>
>>> isinstance(a,basestring)
True

兩者的區(qū)別,概括來講,str是字節(jié)串,由unicode經(jīng)過編碼(encode)后的字節(jié)組成的(好比與python3.x的byte);unicode是對象,才是真正意義上的字符串,由字符組成

>>> a='中文'
>>> len(a)
6
>>> repr(a)
"'\\xe4\\xb8\\xad\\xe6\\x96\\x87'"
>>> b=u'中文'
>>> len(b)
2
>>> repr(b)
"u'\\u4e2d\\u6587'"

控制臺和腳本

在linux下的python控制臺執(zhí)行以下命令,所得的結(jié)果和執(zhí)行腳本是不同的

>>> a = u'中文'
>>> repr(a)
"u'\\xe4\\xb8\\xad\\xe6\\x96\\x87'"
>>> b = unicode('中文','utf-8')b)
>>> repr(b)
"u'\\u4e2d\\u6587'"

可以看到,u'中文'初始化的對象a不是我們所期望的,那究竟是什么原因呢?
將python看成是一根管子,管子里頭處理的中間過程都是使用unicode的。入口處,全部轉(zhuǎn)成unicode;出口處,再轉(zhuǎn)成目標(biāo)編碼(當(dāng)然,有例外,處理邏輯中要用到具體編碼的情況)。
在控制臺執(zhí)行命令a = u'中文',可以將解釋為命令,a = ‘中文'.decode(encode),從而到到unicode對象a。那么這里的encode是什么呢?對于控制臺來說,就是標(biāo)準(zhǔn)輸入,即sys.stdin.encoding

>>> sys.stdin.encoding
'ISO-8859-1'

我的這邊控制臺默認(rèn)的編碼是ISO-8859-1,故a = u'中文' <=> a = '中文'.decode('ISO-8859-1')
這里的'中文'是控制臺理解的,即使根據(jù)終端編碼方式編碼后的字節(jié)碼,對于utf-8編碼的終端,'中文'='\\xe4\\xb8\\xad\\xe6\\x96\\x87'

>>> a='中文'.decode('ISO-8859-1') 
>>> repr(a)
"u'\\xe4\\xb8\\xad\\xe6\\x96\\x87'"

那如何修改此編碼值呢,設(shè)置為什么呢?在linux環(huán)境中設(shè)置環(huán)境變量方法如下,具體設(shè)置什么只要與終端編碼方式一直即可

export PYTHONIOENCODING=UTF-8

總結(jié)

重新回到最初的那個問題,造成問題的原因是沒有搞清楚unicode和str的區(qū)別,將兩者進(jìn)行了混用。

>>> a = '中文'
>>> a.encode('gbk')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

以上的對象a其實(shí)是str,即字節(jié)碼,若終端是utf-8編碼的話,那么a就是用utf-8 encode的字節(jié)碼。a.encode('gbk') 等價于a.decode(encoding).encode('gbk'),即先將字節(jié)碼解碼為unicode字符,然后再encode為字節(jié)碼。unicode對象作為中轉(zhuǎn)站。那么這里的encoding是什么呢?

>>> import sys
>>> sys.getdefaultencoding()
'ascii'

默認(rèn)是ascii,這正是錯誤為什么報無法用ascii解碼的原因

>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding('utf-8')
>>> a = '中文'
>>> repr(a)
"'\\xe4\\xb8\\xad\\xe6\\x96\\x87'"
>>> a.encode('gbk')
'\xd6\xd0\xce\xc4'

將默認(rèn)編碼改為utf-8,即可。不鼓勵對str使用encode方法,因?yàn)槠渲须[式對str進(jìn)行了解碼。decode只對str,encode只對unicode,一切decode/encode都顯示指定編碼方式。

相關(guān)文章

  • Python并發(fā)編程實(shí)例教程之線程的玩法

    Python并發(fā)編程實(shí)例教程之線程的玩法

    編程的樂趣之一是想辦法讓程序執(zhí)行的越來越快,代碼越寫越優(yōu)雅,這篇文章主要給大家介紹了關(guān)于Python并發(fā)編程實(shí)例教程之線程的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • pycharm設(shè)置當(dāng)前工作目錄的操作(working directory)

    pycharm設(shè)置當(dāng)前工作目錄的操作(working directory)

    今天小編就為大家分享一篇pycharm設(shè)置當(dāng)前工作目錄的操作(working directory),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python-yml文件讀寫與xml文件讀寫

    python-yml文件讀寫與xml文件讀寫

    這篇文章主要介紹了python-yml文件讀寫與xml文件讀寫,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • 淺談Django Admin的初步使用

    淺談Django Admin的初步使用

    本文主要介紹了淺談Django Admin的初步使用 ,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Python如何將bmp格式的圖片批量轉(zhuǎn)成jpg

    Python如何將bmp格式的圖片批量轉(zhuǎn)成jpg

    這篇文章主要介紹了Python如何將bmp格式的圖片批量轉(zhuǎn)成jpg問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Python利用multiprocessing實(shí)現(xiàn)最簡單的分布式作業(yè)調(diào)度系統(tǒng)實(shí)例

    Python利用multiprocessing實(shí)現(xiàn)最簡單的分布式作業(yè)調(diào)度系統(tǒng)實(shí)例

    這篇文章主要給大家介紹了關(guān)于Python利用multiprocessing如何實(shí)現(xiàn)最簡單的分布式作業(yè)調(diào)度系統(tǒng)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-11-11
  • 詳解如何基于Pyecharts繪制常見的直角坐標(biāo)系圖表

    詳解如何基于Pyecharts繪制常見的直角坐標(biāo)系圖表

    pyecharts是基于前端可視化框架echarts的Python可視化庫,下面這篇文章主要給大家介紹了關(guān)于如何基于Pyecharts繪制常見的直角坐標(biāo)系圖表的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • 談?wù)剬ytorch中的forward的理解

    談?wù)剬ytorch中的forward的理解

    這篇文章主要介紹了談?wù)剬ytorch中的forward的理解,在Pytorch中,forward方法是一個特殊的方法,被專門用來進(jìn)行前向傳播,本文給大家詳細(xì)講解,需要的朋友可以參考下
    2023-04-04
  • Ubuntu下使用python讀取doc和docx文檔的內(nèi)容方法

    Ubuntu下使用python讀取doc和docx文檔的內(nèi)容方法

    今天小編就為大家分享一篇Ubuntu下使用python讀取doc和docx文檔的內(nèi)容方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • python爬蟲入門教程--快速理解HTTP協(xié)議(一)

    python爬蟲入門教程--快速理解HTTP協(xié)議(一)

    http協(xié)議是互聯(lián)網(wǎng)里面最重要,最基礎(chǔ)的協(xié)議之一,我們的爬蟲需要經(jīng)常和http協(xié)議打交道。下面這篇文章主要給大家介紹了關(guān)于python爬蟲入門之快速理解HTTP協(xié)議的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-05-05

最新評論

淳化县| 城市| 宣汉县| 淅川县| 大新县| 隆子县| 黑山县| 延吉市| 胶州市| 察隅县| 麦盖提县| 长阳| 普宁市| 金寨县| 常州市| 渑池县| 成安县| 子洲县| 托克托县| 香河县| 斗六市| 佳木斯市| 万安县| 丘北县| 甘德县| 阳曲县| 民丰县| 宝丰县| 盐山县| 商河县| 玛沁县| 株洲县| 博乐市| 巴彦淖尔市| 吉木萨尔县| 农安县| 山西省| 博罗县| 茂名市| 荆门市| 温州市|