1. 程式人生 > 其它 >Python2和Python3編碼問題

Python2和Python3編碼問題

技術標籤:python字串亂碼

前言

以下內容來自網上&個人總結,如果有什麼地方錯誤或者表達不準確歡迎指正。

三種編碼

在python從檔案到執行,總計能遇到三種編碼。

  • 首先,.py檔案有自己的編碼方式,也就是這個檔案是以什麼編碼方式儲存在本地的。在windows下,python2預設是ASCII,python3預設是utf-8,這個可以用以下程式碼檢視。
import sys
print(sys.getdefaultencoding())
  • 其次,.py在編譯時要按計算機本身用的編碼來編譯,大部分的中文語言的計算機應該都是GB2312,這個編碼方式可以在檔案開頭用
#coding = utf-8

這種方式來改變,只有這個編碼和上面的檔案編碼一致時才不會導致亂碼問題。

  • 最後,print這個函式有自己的編碼方式,它與stdout的編碼方式是一致的,具體請看參考文獻[2],如果這個編碼不一致的話,有可能會導致無法輸出想要的東西

字串編碼

見下圖
在這裡插入圖片描述
在python2中,字串有str和unicode兩種形式(這兩種的區分並不明顯,有時會引起混淆),而在python3中,變成了byte和str,這就導致了很多程式碼在其中一個python版本中能跑,但是在另一個版本就會報錯,就是可能因為在python2中一個變數是str格式的,到python3後變成bytes格式了,然後函式就不認了,這時有兩種處理方式:

  • 一種是使用encode和decode函式,這兩個函式可以把其中一種轉碼為另外一種,具體如下表:
encodedecode
python2unicode→strstr→unicode
python3str→bytesbytes→str

但是這種方法其實有點本末倒置的感覺,畢竟我們並不是真的想編碼,只是想把python2和python3中變數型別調為一致。而且有時在編碼時會報有的位元組無法被編碼的錯誤。

  • 在介紹另一種方法之前,要先介紹一下字串字首的四種形式:
    • 無字首:單純表示字串str;
    • r字首:r代表row string,也叫做原生字串,字串裡面寫啥就是啥,不進行轉義字元;
    • b字首:表示字串是bytes型別,沒錯,也就是python3中的bytes;
    • u字首:表示字串以 Unicode 格式進行編碼,有時中文會用到。

從上面字首的介紹就可以知道,如果一個字串在python2中作為str處理,那麼只要在前面加上b字首,就可以作為byte處理了。

最後,byte和str有很多函式和符號是通用的(比如+),最重要的一點是它們不能混用。所以只要明確它們的格式,在該用什麼格式的時候就用特定的格式,就可以避免編碼錯誤了。

參考文獻

  1. python中文編碼問題深入分析(一):字元編碼基礎
    連結
  2. python中文編碼問題:print列印中文異常及顯示亂碼問題分析與解決
    連結
  3. Python 編碼為什麼那麼蛋疼?
    連結
  4. python中bytes和str
    連結
  5. Python 2 和 Python 3 有哪些主要區別?
    連結
  6. python3 三種字串(無字首,字首u,字首b)與encode()
    連結