老話說的好:把別人教明白了,自己才算真明白;所以,文章的口吻和用語都偏介紹或是說教學式,在幫助有相同問題的同學看明白的同時,也使自己真的掌握知識點,特此說明。
「問題都是人類自己造成的,計算機沒有錯。」我們以問題為導向,先從報錯出發。**執行過程中我們會遇到各種報錯:比如
於是但是,也是有收穫的,我們發現問題大概分為兩種:python的解碼編碼問題,python的中文解碼編碼問題;
ok,於是我們知道,中文的解碼編碼是個特殊的問題。好。
我們好,這塊知識參考:
看完,我們大體明白,各種為什麼需要編碼解碼以及編碼解碼標準產生的原因;為什麼需要編碼解碼呢?因為計算機的010101二位進製我們看不懂,我們為了看懂,所以需要解碼;又因為,我們要告訴計算機我們幹了什麼告訴計算機去幹什麼,就需要計算機明白我們的「語言」,於是需要編碼。但是,我們人類的語言各式各樣,關於編碼解碼就出現了各種標準。好的,標準定好了就行了。我們可以指定按照這個標準去幹。「但是,總有搗亂的人」,也正是如此,如果世界上所有的事情都是有了標準好好執行就美好了。但是,我們總會不按照標準來,於是就出現了前面所舉的錯誤的情況。
於是,假如我們清楚了各種標準(當然包括標準的相容性問題)。我們發現,故事好像越來越清晰了。因為,我們發現,我們只要能夠清晰、正確地的告訴計算機怎麼按照我們制定的標準好好幹活就好了。事實上,也的確如此。
why—「我們為什麼會出錯」接下來,我們結合python,從你輸入字元,到終端顯示字元的背後過程,力圖弄明白python中字元編碼所涉及的背後邏輯部分。此部分節選自
此處就簡單介紹一下,在python中,從你所輸入的字串,到顯示出字串,這背後的過程是什麼樣的。只有了解了這個大概的過程,和背後的邏輯,你才能真正理解後面的所解釋的,字串編碼解碼方面的錯誤,以及如何解決這樣的錯誤。
你看到的只是:
然後你去執行的對應**,該python**,經過python系統,(此處及之後,我稱其為python解析器),的處理
使得你可以看到最終所輸出的字串
而python解析器所幹的事情,就是:
python解析器,根據當前的所用的字串編碼型別
當然你沒顯示的指定的話,那就用預設的配置
如果是python檔案,如果你沒宣告檔案編碼,則使用預設的編碼:utf-8
去執行你的python**
如果是某種編碼型別的str,則需要該str的編碼型別,和目標終端編碼匹配
如果是utf-8的字串,輸出到windows的預設編碼為gbk的cmd,就會出錯
對相應的字元,進行編碼(為某種特定型別的字元str),或解碼(為對應的unicode型別的字元)
how— 「為了避免出錯,我們人類應該注意什麼」很明顯,如果你不遵守上述規則,出現前面編碼不一致的情況,那麼就會出現一些常見的編碼解碼方面的錯誤了。因此,開頭我們推理出來得什麼「中文編碼問題」「編碼問題」最終歸結到守規矩的問題上來了。
此處只是簡單舉例如下:
到現在,遵守規則的問題就轉化為,具體的編碼解碼要一直的原則(當然也有相容的情況,比如)
所以,諸如此類的問題,如果搞懂了之前的邏輯,那麼自然很容易理解其錯誤的根源,並找到解決辦法。
即,知其所以然,之後,更容易,知其然。
examples結合常見的具體錯誤,採用「p—a—s」三步法,解決問題p,【即phenomenon,錯誤案例(現象)】—>w,【即analysis分析(分析原因)】—>s,【solution(解決問題)】
型別2:python中,列印字串時,字串本身的編碼,與輸出終端中所用編碼不匹配
型別3:python中,列印含某些特殊字元的unicode型別字串,但是輸出終端中字元編碼集中不包含這些特殊字元
參考:
Python中的編碼與解碼
之前一直對python檔案中編碼解碼糊里糊塗,今天看到一篇文章,覺得把我講的有點明白了。寫個心得吧。python 裡面的編碼和解碼也就是 unicode 和 str 這兩種形式的相互轉化。編碼是 unicode str,相反的,解碼就是 str unicode。str形式,也就是字串形式都是以一定的...
python中的編碼和解碼
計算機中常見的編碼方式有多種,英文一般是ascii編碼,其他有unicode,utf 8,gbk,utf 16等編碼。常見編碼方式 python中的編碼轉化 python內部的字串一般是unicode編碼,unicode是utf 8 gbk等編碼的父編碼,這些子編碼方式之間不能直接轉化,需要先轉化成...
python中的編碼與解碼
解碼 位元組 以特定的編碼方式 字元 ascll unicode字符集 utf 8 gbk gb2312 gb18030 個人感覺python2中的編碼非常的不友好,而目前python3中以 utf 8 作為系統預設編碼讓人省心不少 sys.getdefaultencoding 檢視預設編碼方式對應...