標籤:python encode repr 亂碼 編碼
#encoding:utf-8
#用命令列執行
s = ‘百度‘
print s # 輸出環境為gbk,編碼為utf-8,輸出亂碼
print s.decode(‘utf-8‘) # => 發現輸出環境為gbk,自動轉換
print s.decode(‘utf-8‘).encode(‘utf-8‘) # 輸出環境為gbk,編碼為utf-8,輸出亂碼
print s.decode(‘utf-8‘).encode(‘gbk‘) # 輸出環境為gbk,編碼為gbk,正常輸出
# s = 0xF21938274ABDS... 二進位記憶體
# 把這些記憶體資料轉化為可顯示的字串就是repr(s)的print結果,不可顯示的字元變為如\x,
# repr(s) 並非這些記憶體資料,也並非記憶體資料按char解釋成可顯示的字元。
# repr(s) 的意義是 print repr(s)的到的結果,是記憶體資料按char解釋成可現實的字元
# 如設 s = 0x24 = ‘\n‘, 則 print repr(s) => ‘\n‘, repr(s)為‘\\n‘ (因為要顯示\)
#
# s 的記憶體資料按照一定編碼解釋,可以得到正確意義
# 若s是按照utf-8編碼的 ‘哈哈‘,用utf-8解釋就可以得到 ‘哈哈‘ 的意義
# 在python中把s按照 xyz 編碼解釋,就是 s.decode(xyz)
# s.decode(xyz) 在python中得到一個變數,不關心它的記憶體表示,也許就是『資料+編碼方式』
# 無論在記憶體中如何表示,這個變數的抽象意義可以提取出,我們就認為它是抽象的 ‘哈哈‘
# 一個解釋後的字串,可以轉換其編碼,就是意義不變,編碼方式變,得到不同的位元據
# cmd的輸出環境為gbk,utf-8編碼的位元據直接在cmd裡print會得到亂碼
# 將utf-8編碼的資料先用utf-8格式解碼出意義,再將其編碼為gbk位元據,在cmd輸出正常
# 將utf-8編碼的資料先用utf-8格式解碼出意義,直接輸出,python會自動檢測輸出環境
# 將知道意義的字串按照輸出環境自動解碼
# python中#encoding:xxx是說明在python代碼按照什麼格式解碼
# 一般不同的編碼英文都相同可以識別
# 而檔案在編輯時是與編輯器互動,編輯時我們看到的是意義,編輯器使用一種編碼儲存代碼意義
# 代碼意義被編輯器儲存成位元據檔案在儲存空間裡
# 代碼檔案被python解譯器執行時,會尋找其中#encoding:xxx,確定代碼格式編碼
# 如果代碼中聲明的編碼方式和檔案儲存的編碼方式不同,除了英文字元,其他很可能出錯
# 以為python解譯器用B編碼去解釋編輯器用A編碼儲存的意義
# 一般來說中文的不同編碼方式都不相容,所以不同編碼的解釋會導致亂碼
# 通俗解釋
# 我們用來交流的都是語言的意義,不同編碼相當於不同文字的書寫,都是用來儲存意義
# 拿到一段文字,按英語文法解釋就是將其用英語格式解碼。python中decode
# 心理想一段話,按中文寫下來就是將其用中文編碼儲存。python中encode
# 我們與輸入輸出互動的是意義,如果其輸出不是亂碼,表示意義互動成功,否則失敗
# 編碼方式是不同軟體 解譯器,檔案編輯器,cmd命令列 它們使用的語言。
# 也就是我們要讓這些軟體成功的交流,在他們可能使用不同語言情況下。
# 這樣,我們把意義傳給編輯器,編輯器用A語言書寫,解譯器就要用A語言閱讀。
# 而cmd輸出需要用B語言,解譯器就要把A語言的文字轉化成意義,在轉化成B語言給cmd
# cmd拿到B語言的文字,可以翻譯出它的意義,顯示在螢幕上,也就是沒有亂碼的輸出結果
# 所以,上面的代碼如果不在cmd在其他python IDE裡執行,可能得到結果不同
# 因為cmd會的是gbk "語言",而其他的python IDE可能直接會utf-8,那亂碼出現的情況就不同
Python亂碼,編碼,repr,encode,decode探究