python 字元編碼學習小結 二

2022-07-08 13:03:15 字數 2957 閱讀 5618

一、常見的編譯碼問題:

先來說幾個常見的問題吧。

這2個問題,都是最最常見,又最基本典型的問題,又最基本的2個問題,從這2個問題出發,弄清楚問題產生的原因,後面很多問題基本都是組合場景,能比較輕鬆解決。

二:問題產生原因分析

1、根本原因:

2、分析問題1產生原因和解決方法:

第一步: ***格式的txt檔案被讀取到記憶體中

第二步:顯示器按&&&方式來讀取?

當&&& 與 ***不一致就會亂碼,分析如下:

a: 正常預設情況下,python解析器嘗試使用 &&& = gbk格式(windows預設格式:cp396->gbk)來解析這塊記憶體資料來顯示:

a : 如果讀取的檔案是*** =gbk格式,ok,不亂碼

b : 如果讀取的檔案是*** = utf-8格式就會產生亂碼。因為以utf-8形式表示的編碼在gbk編碼中被解釋成其他字串導致產生亂碼

b: 而如果此時在在pycharm裡可以通過設定settings的encoding格式=utf-8來解析這塊記憶體資料:

a: 如果讀取的檔案是gbk格式會產生亂碼。因為以gbk形式表示的編碼在utf-8編碼中被解釋成其他字串導致產生亂碼

b : 如果讀取的檔案是utf-8格式就不會亂碼。

a.b 解決辦法:.decode(

'utf-8

').encode('

gbk')或者decode('

utf-8')

b.a 解決辦法:decode(

'gbk

').encode('

utf-8

')或者decode('

gbk'

)其中,windows預設的解析格式是gbk,在pycharm裡可以通過設定settings的encoding格式來設定;而檔案儲存格式,在notepad++可以選擇

讀取檔案推薦使用方法:

推薦使用codecs模組,

使用codecs/io.open()顯示指定檔案編碼格式。

python 2 open(filename,mode),不支援encoding引數,但python 3支援

3、分析問題2產生原因和解決方法:

第一步: 以***編碼格式儲存py檔案。

第二步:顯示器按&&&方式來讀取?

在解析過程中,當字元在***無法找到時程式會拋異常,分析如下:

a: 正常預設情況下,python的預設編碼是 *** =ascii編碼:

a : 預設情況下,python解析器嘗試使用 &&& =gbk 來解析資料,但是中文並不是ascii字元,導致直譯器不知如何處理,拋異常.

b : 設定pycharm的settings的encoding格式 = utf-8

, 來解析資料,但是中文並不是ascii字元,導致直譯器不知如何處理,拋異常.

解決方法:宣告原始檔的編碼方式。

三、其他常見不同型別問題

1、不可見字元bom導致解析異常

2、chardet檢測位元組流編碼格式,是基於概率,存在不準確的問題。位元組編碼無法準確猜對,必須明確告知

3、os.walk() 遍歷含中文的路徑時中文亂碼報錯 

現在需要遍歷e:/ 下的路徑,部分如下所示,存在中文檔名

a:  報錯**段如下:讀取的

#!/usr/bin/python

# -*- coding: utf-8 -*-import os

for root, dirs, files in os.walk("e:/", topdown=false):

for name infiles:

print(os.path.join(root, name))

讀取結果如下:

b: 導致取讀錯誤的原因如下:

os.walk(folder_name) 返回的檔案路徑編碼和入參folder_name編碼有關:

• 當folder_name是unicode時,os.walk返回的root,directories, filenames也是unicode

• 否則按照sys.getfilesystemencoding()編碼返回str.中文windows 系統sys.getfilesystemencoding()返回「mbcs」(即:「gbk」)英文ubuntu系統sys.getfilesystemencoding()返回「utf-8」

如果根路徑中有中文,路徑需要使用unicode編碼作為os.walk的入參

c : 修改**如下,能正常讀取中文路徑

for root, dirs, files in os.walk(u"

e:/", topdown=false):

或者for root, dirs, files in os.walk("

字元編碼小結

1 早期只有127以內的字元 20以內是控制字元。2 後來各國有了自己的編碼,但一般是兩個位元組表示乙個字元 中國 3 unicode 就是解決各國之間衝突的問題,定義了統一的標準。可以65025個字元。這樣英文也是乙個字元兩個位元組,這樣的好處是全世界統一。4 utf 系列其實和unicode可以...

字元編碼小結

ansi ascii american standard code for information interchange 乙個位元組 字元 0 0x32 為控制碼 33 255 為 字元 中 國人民 gb2312 去掉ascii表127之後的定義.規定 乙個小於127的字元意義與原來相同,兩個大於...

字元編碼小結

儲存器位 bit 位元組 byte 字 word 雙字 double word 1 byte 8 bits 1 word 2 bytes 16 bits 1 double word 2 words 4 bytes 32 bits 單位元組來自遠古時代。計算機最初是在美國等國家發明的,所以只需要把英文...