国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

關(guān)于解決Python亂碼問題的終極解決方案 (TL;DR)

Lemon_95 / 1121人閱讀

摘要:關(guān)于解決亂碼問題的終極解決方案有個(gè)特別好玩的現(xiàn)象,當(dāng)我們?yōu)榱司幋a頭疼的時(shí)候,幾乎搜索到所有的文章都會(huì)先發(fā)一通牢騷。另外,關(guān)于的亂碼問題,又是一個(gè)新的較長(zhǎng)篇章。

關(guān)于解決Python亂碼問題的終極解決方案 (TL;DR)

有個(gè)特別好玩的現(xiàn)象,當(dāng)我們?yōu)榱藀ython編碼頭疼的時(shí)候,幾乎搜索到所有的文章都會(huì)先發(fā)一通牢騷。然后在無可奈何地寫解決思路(是解決思路不是方案)。這個(gè)問題真不是新手問題,即使是十幾年python老手也經(jīng)常頭疼。中國(guó)外國(guó)都一樣。看看這個(gè)python專家在PyCon大會(huì)上用半個(gè)多小時(shí)講解亂碼的視頻就了解了,他自己都給自己的來回encoding, decoding, encoding, decoding說暈了,臺(tái)下舉手他都拒絕回答,可想而知這個(gè)問題復(fù)雜性。

我認(rèn)為,幾乎每個(gè)pythoner,都會(huì)有一段人生浪費(fèi)在了編碼上。可以說這個(gè)問題,是如果你不徹徹底底解決,就永遠(yuǎn)會(huì)崩潰的地步。翻看我曾經(jīng)寫的數(shù)篇文章就知道了:

對(duì)Python 2.x的通宵抱怨

Python中文字符的理解:str()、repr()、print

Python里中文編碼的理解:unicode、utf-8、gbk

牢騷結(jié)束,下面是我又一次用了兩個(gè)整天才測(cè)試整理書寫完成的ipython notebook筆記。ipynb格式的筆記源文件在這里,當(dāng)然有可能會(huì)鏈接失效,有喜歡ipython的live coding筆記的且想要用這個(gè)筆記測(cè)試編碼的,請(qǐng)聯(lián)系我。

首先,需要先要了解python的print大法

如果python的print的特性都沒有了解的話,希望你不要貿(mào)然嘗試用print去調(diào)試測(cè)試亂碼編碼的問題。
這里的print厲害到讓你不高興的地步——它不管你塞過來的是什么格式什么編碼,字符串?dāng)?shù)組對(duì)象什么的的都一口氣全打印出來。
感覺好像很好,但其實(shí)是我們仔細(xì)研究編碼問題的最大阻礙。
因?yàn)槟闳oprint一個(gè)unicode它能打出中文,塞一個(gè)utf-8或iso8895給它,也一樣給你打印出原文。這樣以來,你看著它出現(xiàn)原文后,就欣喜若狂產(chǎn)生了一種勝利的錯(cuò)覺。
所以我想在這里最先說清楚它:

不要輕易在研究亂碼的時(shí)候用print測(cè)試目標(biāo)!

也不是說這種時(shí)候一點(diǎn)都不能用,而是說你可以print別的什么東西,但是如果想看清某個(gè)變量本質(zhì)的話,千萬不要用。
這個(gè)時(shí)候要用print repr(字符串) ,或者最好是在命令行或ipython里面測(cè)試,像這樣:

看出區(qū)別了嗎?明確了這點(diǎn),再來繼續(xù)研究編碼問題。

簡(jiǎn)單來說,先要記住,在Python2里字符串只有兩大陣營(yíng): unicodestr

如果type(字符串)顯示結(jié)果是str,其實(shí)指的是bytes字節(jié)碼。
而其它各種我們所說的utf-8gb2312等等也都是Unicode的不同實(shí)現(xiàn)方式。
這里不要去考慮那么復(fù)雜,只要先記住這兩大陣營(yíng)就行。

encodingdecoding

絕對(duì)要記住的:
unicode轉(zhuǎn)換到str,這個(gè)叫encoding,編碼。
str轉(zhuǎn)換到unicode,這個(gè)叫decoding,解碼。

(圖片引用自知乎相關(guān)某答案。)

來回記住這個(gè)問題,才能進(jìn)入下一步!

然后來看個(gè)案例。

通過上面兩種格式的對(duì)比我們看到,str和unicode的各種區(qū)別。

那么,既然變量里面會(huì)出現(xiàn)兩種不同的格式,如果我們把兩種格式的字符串連在一起操作會(huì)發(fā)生什么呢?
如下:

看!著名的編碼錯(cuò)誤UnicodeDecodeError: "ascii" codec can"t decode就這樣出現(xiàn)了!

以上是我們用顯性字符串來比較兩種格式字符串的區(qū)別。

但是,我們經(jīng)常性處理python編碼問題,都不是在這種顯性的字符串上出現(xiàn)的,不是從網(wǎng)上爬取的就是從本地文件讀取的,意思就是文件內(nèi)容龐大,編碼格式很難猜到是什么。
所以這里我們將問題再拆分為兩部分討論:本地文件和網(wǎng)絡(luò)資源。

本地文件編碼測(cè)試

首先在本地建立一個(gè)有中文的以utf-8格式保存的文本文件(實(shí)際上無論.txt還是.md等都無所謂,內(nèi)容是一樣的)。
內(nèi)容只有"你好"。

然后我們來讀取一下:

上面看到,從文件讀取出來的,就是str格式的字符串。
那么如果要把str轉(zhuǎn)化為unicode,就要解碼,也就是decoding.

這種時(shí)候?qū)嶋H上是最迷糊也最容易造成之后錯(cuò)誤的,就是分不清該編碼還是該解碼。
所以上面提到,必須要記住這兩個(gè)區(qū)別。
那么如果現(xiàn)在我搞反了怎么辦?就會(huì)再次出現(xiàn)下面錯(cuò)誤:

話說回來,我們?cè)撛趺唇y(tǒng)一他們呢?
為了避免兩種格式的字符串在一起亂搞,統(tǒng)一他們是必須的。但是以哪一種為統(tǒng)一的呢,unicode還是bytes?

網(wǎng)上各種文章統(tǒng)一口徑,要求代碼中出現(xiàn)所有的變量都統(tǒng)一為unicode。
可是我在實(shí)踐和測(cè)試中都越來越發(fā)現(xiàn):這種做法真的不那么可靠,甚至我懷疑有可能我們碰到那么多的問題,都是由它攪亂引起的。

下面我們來看看做常用的環(huán)境下字符串都是什么格式

這樣就明白了:除了r.text返回的內(nèi)容外,其它幾乎都是使用str格式,也就是bytes字節(jié)碼碼。所以我們只要轉(zhuǎn)化requests相關(guān)的內(nèi)容就行!

實(shí)際上,requests返回的response中, 除了用.text獲取內(nèi)容,我們還可以用.content獲取同樣的內(nèi)容,只不過是bytes格式。

那就正和我們意,不用再去轉(zhuǎn)化每一個(gè)地方的字符串,而只要盯緊這一個(gè)地方就足夠了。

為什么我們不能把所有字符串變量統(tǒng)一為unicode呢?

先提醒下,變成unicode的過程,叫decoding。不要記錯(cuò)。
.text經(jīng)常把ISO8859等猜不到也檢測(cè)不到編碼(機(jī)率很低)的字符串扔過來,如果遇到的話,是很麻煩的。
decoding有兩種方法:

unicode(b"你好‘)
b"你好".decode("utf-8")

這里因?yàn)椴恢纴碓吹木幋a,所以必須用unicode()來解碼,而不能用.decode("utf-8"),因?yàn)轱@然你不能亂寫解碼名稱,如果來源果真是(很大幾率是)ISO8859等方式,那么錯(cuò)誤的解碼肯定會(huì)產(chǎn)生亂碼,或者直接程序報(bào)錯(cuò)。切記!

所以這里只能用unicode()解碼。如下例:

結(jié)論:一定記住,全文都統(tǒng)一用str格式字符串 只要盯緊requests、json等這種經(jīng)常處理外來資源的庫(kù)就好了。

只要控制好外來源的字符串,統(tǒng)一為str,其它一切都好說!

實(shí)際上,我發(fā)現(xiàn)遇到的絕大多數(shù)編碼問題,實(shí)際上不是python原生方法導(dǎo)致的,而是這些外來庫(kù)所引起的!因?yàn)槊總€(gè)模塊都會(huì)有自己的一套處理編碼的方式,你還真不知道它是采用哪個(gè)。就像JSON的dumps()一樣埋著大坑等著我們。所以真正應(yīng)該盯緊的就是這些庫(kù)了。

下面是一個(gè)從獲取網(wǎng)絡(luò)資源(含中文且被requests認(rèn)為編碼是ISO8850的網(wǎng)頁(yè))到本地操作且存儲(chǔ)到本地文件的完整測(cè)試。

import requests

r = requests.get("http://pycoders-weekly-chinese.readthedocs.io/en/latest/issue5/unipain.html")

# write a webpage to local file
with open("test.html", "w") as f:
    f.write( r.content )

# read from a local html file
with open("test.html", "r") as f:
    ss = f.read()

大功告成!效果如下:

再也不用糾結(jié)、檢查每一個(gè)變量、寫一大堆嵌套轉(zhuǎn)化方法了!注意,只要盯緊各種外來模塊和庫(kù)的文字處理就夠了。
另外,關(guān)于JSON的亂碼問題,又是一個(gè)新的較長(zhǎng)篇章。我會(huì)單分一篇,請(qǐng)到我的專欄里找。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/41379.html

相關(guān)文章

  • JavaWeb 亂碼問題終極解決方案

    摘要:經(jīng)常有讀者在公眾號(hào)上問亂碼的問題,昨天又有一個(gè)小伙伴問及此事,其實(shí)這個(gè)問題很簡(jiǎn)單,但是想要說清楚卻并不容易,因?yàn)槊總€(gè)人亂碼的原因都不一樣,給每位小伙伴都把亂碼的原因講一遍也挺費(fèi)時(shí)間的,因此,松哥今天決定寫一篇文章,和大伙好好捋捋中的亂碼問題 經(jīng)常有讀者在公眾號(hào)上問 JavaWeb 亂碼的問題,昨天又有一個(gè)小伙伴問及此事,其實(shí)這個(gè)問題很簡(jiǎn)單,但是想要說清楚卻并不容易,因?yàn)槊總€(gè)人亂碼的原因...

    canger 評(píng)論0 收藏0
  • 一文幫你發(fā)現(xiàn)各種出色GAN變體

    摘要:也是相關(guān)的,因?yàn)樗鼈円呀?jīng)成為實(shí)現(xiàn)和使用的主要基準(zhǔn)之一。在本文發(fā)表之后不久,和中有容易獲得的不同實(shí)現(xiàn)用于測(cè)試你所能想到的任何數(shù)據(jù)集。在這篇文章中,作者提出了對(duì)訓(xùn)練的不同增強(qiáng)方案。在這種情況下,鑒別器僅用于指出哪些是值得匹配的統(tǒng)計(jì)信息。 本文不涉及的內(nèi)容首先,你不會(huì)在本文中發(fā)現(xiàn):復(fù)雜的技術(shù)說明代碼(盡管有為那些感興趣的人留的代碼鏈接)詳盡的研究清單(點(diǎn)擊這里進(jìn)行查看 鏈接:http://suo....

    qpal 評(píng)論0 收藏0
  • Python 性能快速優(yōu)化: 系列二

    摘要:注本文的原文地址為這個(gè)是性能快速優(yōu)化的第二部分,第一部分請(qǐng)點(diǎn)擊這里。當(dāng)你寫代碼了,過一遍數(shù)據(jù)結(jié)構(gòu),迭代結(jié)構(gòu),內(nèi)建和為創(chuàng)建擴(kuò)展,如有必要。更新是在的范圍之外,這意味著你可以使用這個(gè)標(biāo)準(zhǔn)庫(kù)來運(yùn)行多個(gè)進(jìn)程。看下我的的印度演講 注:本文的原文地址為 Quick Python Performance Optimization: Part II 這個(gè)是 Python 性能快速優(yōu)化的第二部...

    yexiaobai 評(píng)論0 收藏0
  • Promise--一諾千金

    摘要:立即執(zhí)行的驗(yàn)證的參數(shù)是異步調(diào)用的驗(yàn)證當(dāng)在中通過調(diào)用使?fàn)顟B(tài)穩(wěn)定之后,不管調(diào)用多少次,值都不會(huì)再發(fā)生變化一諾千金的優(yōu)點(diǎn)是什么我看了很多文章在介紹的時(shí)候都會(huì)提到回調(diào)噩夢(mèng)。 showImg(https://segmentfault.com/img/remote/1460000006797059); TL;DR本文是對(duì) Promise 一些概念點(diǎn)的歸納和對(duì) Promise 在解決什么問題的思考。...

    xiongzenghui 評(píng)論0 收藏0
  • Mysql在debian系統(tǒng)中不能插入中文終極解決方案

    摘要:在環(huán)境下,徹底解決無法插入和顯示中文的問題下插入中文顯示亂碼解決方案回車輸入密碼進(jìn)入查看狀態(tài)如下默認(rèn)的是客戶端和服務(wù)器都用了,所以會(huì)亂碼。解決方案上文提到了用臨時(shí)方法更改數(shù)據(jù)庫(kù)的字符集設(shè)置,顯示中文,但是后來發(fā)現(xiàn)在有的系統(tǒng)下并不能成功。在debian環(huán)境下,徹底解決mysql無法插入和顯示中文的問題Linux下Mysql插入中文顯示亂碼解決方案mysql -uroot -p 回車輸入密碼進(jìn)入...

    Tecode 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<