詳談Python中文件的編碼格式


對於Python中的中文字符串的處理方式

一、源代碼中的編碼方式分析

------所有的文本文件在保存的時候,都會將文本進行編碼【數據在計算機中是以二進制的方式存儲】,文本的編碼方式一般默認為ANSI編碼方式(ANSI並不是某一種特定的字符編碼,而是在不同的系統中,ANSI表示不同的編碼。在英文系統中ANSI編碼其實是ASCII編碼;在中文系統中ANSI編碼其實是GBK編碼)。

------如果代碼中包含了非ASCII字符(比如中文),而源代碼沒有聲明文件的編碼方式,編譯器就會默認以ANSI編碼方式去對代碼中的字符串進行解析,當發現字符串中包含大於127的字節時,就會報錯。因此,當源代碼中包含非ASCII字符時,需要在文件開頭聲明文件的編碼方式,如utf-8或者gbk。

------然而,文件編碼方式的聲明只能保證代碼的正常執行,並不能保證非ASCII字符串的正常輸出顯示。上述代碼在idle上輸出為正常的中文,但是在pycharm上會輸出亂碼。這是因為不同的IDE對非ASCII字符串的支持程度不同。idle在打印非ASCII字符串時,會使用文件的編碼方式將字符串解碼成unicode字符串,然后顯示到界面上;而pycharm的IDE設置中有一個IDE的編碼方式設置,如果源代碼的編碼方式與IDE的編碼方式不同,直接輸出非ASCII字符串就會出現亂碼。解決方法為將需要打印的非ASCII字符串以源代碼的編碼方式進行解碼,使之轉化為unicode字符串。所有實際內容相同的非ASCII字符串轉換為unicode編碼之后,編碼均相同。筆者猜測IDE在打印字符串的時候(不論是不是unicode字符串),會先將字符串統一轉化為unicode字符串,然后使用一套機制將unicode字符串打印出來。

二、讀寫文件時的編碼方式分析

對編碼方式有了一個初步的認識之后,下面對讀寫文件時的編碼方式進行介紹。
········文本文件都是以字節串的方式存放在硬盤中的。文本編輯器在保存文件的時候,對於非ASCII編碼的字符串(如中文),會先使用文件默認的編碼方式將其編碼為字節串(二進制字節碼)。

········程序讀取文件時(讀取文件是數據由硬盤---》內存;由二進制---》字符串),獲取到的內容仍然為編碼后的字節串【此時的編碼后的字符串並不是Unicode字符串】【此時若不進行解碼的話讀取出來的字符串會是字符串亂碼】【可以使用GBK編碼方式或者UTF-8編碼方式解碼為Unicode字符串】

········若想要恢復文本的內容即使其正常顯示,並且對文本內容進行正常的打印,必須先將字節串解碼為unicode字符串

a = '你好'  # 存儲在內存中的對象(數據存儲在計算機內存中)(以Unicode字符串的方式存儲)
print(a)  # Pycharm默認設置編碼格式為UTF-8--此時打印的是Unicode字符串

s = a.encode('utf-8')  # 將Unicode字符串編碼為二進制字節碼(可以理解為存儲到文件中即計算機硬盤)
print(s)  # 此時打印的數據是a的二進制字節碼

print(s.decode(encoding='utf-8'))  # 將二進制字節碼解碼為Unicode字符串(可以理解為從文件讀取數據即從硬盤中讀取數據到內存中)

三、關於python中的不同類型數據在計算機中的存儲

python帶有三種字符串對象類型--一種用於文本數據,兩種用於二進制數據:
①str表示Unicode文本(8位和更寬的)----》若想要存儲在計算機硬盤中,需要編碼為二進制字節碼
②bytes表示二進制數據----》可以直接存儲在計算機硬盤中
③bytearray表示一種可變的bytes類型----》可以直接存儲在計算機硬盤中


注:str.encode():把一個字符串編碼為其raw bytes形式【二進制字節碼】
bytes.decode(): 把raw bytes節碼為其字符串形式
str----->bytes,叫encode【編碼】
bytes---->str,叫decode【解碼】

常見中文編碼名稱:
編碼名稱 用途
utf-8 所有語言
gbk 簡體中文
gb2312 簡體中文
gb18030 簡體中文
big5 繁體中文
big5hkscs 繁體中文


詳細解釋:
······在計算機內存中,統一使用Unicode編碼【內存中數據體現為Unicode字符】,當需要保存到硬盤或者需要傳輸的時候,就轉換為UTF-8編碼【保存到硬盤或者傳輸需要以二進制的方式】
······用記事本編輯的時候,從文件讀取的UTF-8字符被轉換為Unicode字符到內存里【二進制數據解碼為Unicode字符】【此時可以在記事本編輯頁面看到】,編輯完成后,保存的時候再把Unicode轉換為UTF-8保存到文件【Unicode字符編碼為二進制數據】【此時文本中的數據以二進制的方式保存到計算機中】;瀏覽網頁的時候,服務器會把動態生成的Unicode內容轉換為UTF-8再傳輸到瀏覽器【此時Unicode字符被解碼為二進制數據】;所以你看到很多網頁的源碼上會有類似<meta charset="UTF-8"/>的信息,表示該網頁正是用的UTF-8編碼。

總結:

 

#中文一般是gbk碼,window的系統一般是用gbk編碼,但是用這個編碼不可以和別的國家語言通用#
#后來出了萬國碼,unicode,utf-8是它的一部分,別的任何碼都可以轉成unicode#
python3.x后都是默認用Unicode作為編碼。Unicode只能用.encode('')編碼成其他編碼,但是不編碼也可以。
#!-*- coding:utf-8  聲明,python2.7的字符編碼修改
#-*- coding:gbk -*- 聲明,python3.x的字符編碼修改
#python2.7默認是ascii碼進行解碼的
#默認用utf-8的模式時可以在字符串前加u“你好”直接說明是unicode的碼下編碼的
python轉碼后它也會將其轉成byte類型
sys.getdefaultencoding()#打印系統默認使用的編碼
type()#也可以打印編碼類型
encode編碼
decode解碼

 

 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM