筆記四 python2亂碼深度剖析二

2022-04-24 19:41:18 字數 3635 閱讀 9950

一:學習內容

二:獲取更改系統編碼

1. 獲取系統編碼

import sys

print sys.getdefaultencoding()

2. 更改系統編碼

#encoding=utf-8

import sys

reload(sys)

sys.setdefaultencoding('utf-8')

print 1,sys.getdefaultencoding()

print 2,type(u"我

")print 3,type("我

")print 4,u"我

"print 5,"我

"print 6,u"我

".encode('utf-8')

print 7,u"我

".decode('utf-8')

print 8,"我

".encode('utf-8').decode('utf-8')

print 9,"我

".decode('utf-8').encode('gbk')

print 10,"我

".encode('gbk')

執行結果為:

問題一:為什麼要reload sys模組

在site.py檔案裡有這麼一段**:

if hasattr(sys, "setdefaultencoding"):

del sys.setdefaultencoding

在sys載入後,setdefaultencoding方法被刪除了,所以我們要通過重新匯入sys來設定系統編碼。

問題二:

為什麼print 4,u"我"可以列印正常,print 5,"我"列印亂碼

字串的列印,python的邏輯為:如果是unicode字串,則可以自動編碼為終端所用編碼,然後正確顯示出來。所以u"我"實際上將"我"進行了decode成了unicode字元,然後python將unicode字串自動化編碼為gbk(我的cmd的編碼)

而print 5,」我」,字串編碼為utf-8型別(檔案儲存

的型別),輸出到cmd為

gbk型別的終端上,則無法顯示。

問題三:為什麼print 8,"我".encode('utf-8').decode('utf-8')可以列印正常,print 6,u"我".encode('utf-8')列印亂碼

因為我是str型別,在

encode前,python自動會用預設編碼(setdefaultencoding)進行decode為unicode型別,但是如果預設編碼為ascii,是不支援

decode

的。

可以看到檔案裡修改了預設編碼為utf-8,所以"我".encode('utf-8').decode('utf-8')這句首先會decode('utf-8')為unicode型別,然後在encode('utf-8').decode('utf-8'),此時」我」已經變成了unicode型別,如果是unicode字串,則可以自動編碼為終端所用編碼(這是問題一中提到的),這樣就能輸出到cmd終端了。

然後我們再說為什麼print 6,u"我".encode('utf-8')會亂碼呢,上面已經講了在encode('utf-8')之前會decode('utf-8')為unicode型別,然後在執行.encode('utf-8'),此時」我」會被編碼成utf-8,然後print輸出到cmd的gbk終端,由於編碼不統一,就會亂碼。

三:判斷字元的編碼型別

1. chardet.detect(字元內容)

#encoding=utf-8

import chardet

import urllib

testdata = urllib.urlopen('').read()

print chardet.detect(testdata)

發現列印的字元編碼型別為utf-8。

第二步:解壓 chardet-2.1.1.tar.gz檔案到\lib\site-packages下

第三步:安裝 chardet模組,進入到python的\lib\site-packages\chardet-2.3.0路徑下,執行python setup.py install

這樣就完成chardet模組安裝了,此時你可以在去執行上面的檔案。

四:檔案儲存和讀取的編碼

1. 計算機記憶體中,統一使用unicode編碼,當需要儲存到硬碟或需要傳輸的時候,就轉換為utf-8編碼

2. 用記事本編輯的時候,從檔案讀取的utf-8字元

被轉換為unicode字元到記憶體裡,編輯完成後,儲存的時候再把unicode轉換為utf-8儲存

到檔案

3. 瀏覽網頁的時候,伺服器會把動態生成的unicode內容

轉換為utf-8在

傳輸到瀏覽器

很多網頁原始碼上會有類似

的資訊,表示該網頁正是用的utf-8編碼

小記:a.  在utf-8檔案中,則這個字串就是utf-8編碼的,它的編碼取決與當前的文字編碼。

b.  gb2312文字的編碼就是gb2312。

c.  在同乙個文字中進行兩種編碼的輸出等操作就必須進行編碼的轉換,先用decode將文字原來的編碼轉換成unicode,再用encode將編碼轉換成需要轉換成的編碼。

d.  例項練習:

手工建立乙個檔案如a.txt,以ansi編碼儲存即gbk,然後取出資料變成utf-8編碼儲存到b.txt檔案中,檢視b.txt檔案編碼為utf-8

#encoding=utf-8

f=open('c:\\users\\yumeiling\\desktop\\a.txt','r')

data=f.read()

temp = data.decode('gbk')

f.close()

f=open('c:\\users\\yumeiling\\desktop\\b.txt','w')

temps=temp.encode('utf-8')

f.write(temps) #寫入utf-8字元,並進行儲存

f.close()

執行結果為:檢視b.txt檔案

這樣執行後,發現生成了b.txt檔案,檔案的編碼為改成了utf-8編碼。

Python2學習筆記(2)

python 中可以直接處理的資料型別包括整數 浮點數 字串 布林值 空值。此外,python還提供了list 字典等資料型別。同時也允許自定義資料型別。30 3 10 10 3 3 10.0 3 3.3333333333333335 10 3.0 3.3333333333333335 print ...

Python2學習筆記(1)

python是用來編寫程式的高階程式語言,其適用範圍如下 python有大量的基礎庫,容易編寫。缺點有 python有命令列模式和互動模式兩種執行 的環境。在互動模式下 在命令列模式下,輸入python回車即可跳轉到該模式 直接輸入 回車即可 在命令列模式下 python檔案以.py結尾,執行時用命...

Python2學習筆記(3)

python內建的一種資料型別列表,是一種有序的集合。可隨時增加和刪除元素。name a b c grade 12,34,10 grade 12,34,10 len grade 3 a 空的list,長度為0 len a 0 name 0 索引從0開始 a name 2 c name 3 下標越界,...