字符編碼

# 字符編碼
# 引題: 在windows資源管理其中新建 含有中文的txt文件,win上的文本文件應用正常打開,但是pycharm中打開中文亂碼。mode(模式)
file = open('chinese_gbk.txt',mode= 'r', encoding='gbk')
print(file.readline())
print(file.readline())
print(file.readline())
print(file.readline())
print(file.readline())

"""
open():  arg1文件名,arg2 模式, encoding 編碼 。
encoding參數如果沒有寫,默認隨系統,windows系統默認編碼爲gbk,linux 、mac系統上的默認編碼爲utf-8。

編碼 encode:計算機中存儲的是二進制(0、1),我們平時用的看到的是英文字符、中文字符、圖片、視頻、word文檔,所以這些內容需要經過規則轉換成二進制才能存儲。這個過程叫編碼。場景:寫文件,傳輸信息。

解碼 decode: 解碼是編碼逆運算,講二進制轉換爲我們平時看到的文字、圖片。
本節課討論純文本文件的編解碼,圖片視頻word文檔的編碼規則複雜不討論。 

(瞭解 爲什麼二進制):計算機通過電壓高低判斷信息,如果電壓區間太接近的話(1v 表示1,2v表示2 ...) ,可能由於電壓不穩導致數據易出錯和檢測困難。所以計算機發明者採用二進制表示低電壓0和高電壓1兩種狀態。

字節:衆多的0、1,爲了存儲表示方便和更好的可讀性。規定每8位二進制數字組成一個字節byte。形如 01010101 。字節是最基本的信息單位。

"""

"""
(瞭解)
引題:編碼就好像近代戰爭,傳輸的信息爲了保密和易於傳輸。將原始信息(明文)經過特定規則轉換加密信息(密文)。傳輸密文。友軍收到密文後按相同規則逆向解讀出原始信息。示例 'abc' 編碼→ '123' 解碼→ 'abc'。  

編碼規則歷史:
信息經過編碼成二進制再存到硬盤當中。計算機只認識二進制01,基本信息單位是8位01組成的字節。
首先對容量單位有個大概認識,
1byte = 8bit           一個字節8位(比特) 形如01010101   寬帶50mbps
1kb = 1000byte              一個幾十行的py文件大小爲3kb
1Mb = 1000kb                一首mp3個區大概5Mb左右              
1GB = 1000Mb = 1000000kb    一個電影大概2G左右,固態硬盤大約250G
1TB = 1000G                 一個大容量機械硬盤3Tb

計算機早期內存、硬盤容量小且昂貴。科學家思考,我要在計算機中存儲a A 0 1 +
常見字母、數字、運算符。想出了一套編碼方式ascii(美國信息交換標準代碼)。
ascii編碼:用8位二進制,也就是1byte字節,來表示常見英文大小寫、數字定義表示出來。2的8次方一共有256種可能,足夠表示出常見大小寫字母、數字、運算符、部分特殊符號。例如01100001 代表字母a。

後來計算機漸漸發展,傳到了國外,中國、韓國、日本、歐洲等。
中國大陸的科學家爲了使用計算機,爲了存儲漢字,也發明了一套編碼gb2312。
GB2312:漢字有幾萬種,一個字節256種排列不夠,所以用兩個或更多字節存儲漢字。這套編碼方式可以編兩萬個漢字。
GB18030: GB2312發現不夠用,繁體字特殊字符。所以人們補充新標準,可以編碼7萬多漢字。
上面兩種具體編碼方式都屬於GBK編碼。

與此同時,中國臺灣省、日本、韓國等等其它國家都研究出了自己國家的編碼方式。Erxxx。
全世界有很多套編碼方式,自己國家網站和軟件可以使用,但跟其它使用時經常由於編解碼方式不統一而出現亂碼錯誤,不利於軟件知識在世界範圍內的溝通交流。編碼方式混亂。

出現亂碼的原因在於編碼和解碼不匹配。比如臺灣某網站用某編碼方式編繁體字,你用電腦打開,電腦默認用gbk解碼,由於規則不對應,所以亂碼。  例如編碼規則1 “abc ... 對應 123...” 編碼規則2“abc ...對應567 ",這樣信息'abc'經規則1轉換後爲'123', '123'經規則2解碼後錯誤出現亂碼。

爲了改變這種混亂的編碼狀況,計算機的硬盤價格開始降低容量增大,一個國際組織定義了一套統一的編碼方式,Unicode (union)。unicode編碼方式用4個字節進行編碼,2的32次方42億多種可能,可以把所有國家的文字都編碼進去(俗稱萬國碼),還包括特殊字符(希臘字母、數學字符),還包括emoji表情圖。

但是用unicode編碼後,還有一些問題。一是計算機接收到了4個字節,到底是ascii編碼的4個字符還是unicode編碼的1個字母,二是純英文信息的話,unicode編碼佔用磁盤體積將是ascii編碼的4倍,浪費大。ascii編碼的字母a的二進制爲01100001 , unicode編碼兼容ascii編碼,字母a第一個字節跟ascii編碼一致,其它三個字節填充0,最終unicode編碼的a是 00000000 00000000 00000000 01100001。

爲了避免上述缺點,提供了幾種優化後的存儲方式,比如utf-8、utf-16、utf-32。目前最常用的utf-8。
utf-8使用變長1-4個字節存儲信息,比如上面unicode編碼的a,只存儲有用的一個字節,而當遇到中文時,用2-3字節來存儲,這樣的話既保證兼容,又能以較小的存儲空間存儲。
unicode是一種編碼方式、編碼思想,utf-8是unicode一種具體的實現方法。


"""


"""
# py2和py3編碼區別
python2 默認ascii編碼,如果.py文件中出現中文,系統嘗試用ascii去編碼中文,就彙報超出編碼範圍錯誤。
所以要在.py文件第一行需要顯示聲明編碼方式  # coding='utf-8'    # -*- encoding:utf-8 -*- 

python3 默認unicode編碼。程序中字符串其實都先轉換成中間產物unicode編碼,形如'\u4e2d'。
"""


"""
pycharm相關
設置/editor/file encoding  ,建議保持默認設置或都設置爲utf-8。當pycharm打開文件或項目出現亂碼時,調整編碼方式爲gbk或utf-8。
pycharm編輯器中new file,用utf-8編碼。
"""

"""
編解碼相關錯誤:
1)文件本身是gbk(windows記事本創建的txt),用utf-8解碼。
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 46
2) 文件本身是gbk或utf-8編碼,包含中文,但解碼時用ascii。
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc8 in position 46: ordinal not in range(128)
3)嘗試用ascii去編碼中文,python2中常見錯誤
UnicodeEncodeError: 'ascii' codec can't encode character '\u4e2d' in position 0: ordinal not in range(128)
"""

"""
關於操作系統:
windows操作系統默認gbk;macOS和linux默認的utf-8。
windows記事本默認英文ascii、中文gbk;但win上的pycharm、sublime默認utf-8。
所以平時新建文件建議使用pycharm或sublime。

1)修改源文件:windows記事本另存爲的時候可以修改編碼爲utf8。
2)修改解碼方式:pycharm打開一個gbk文件時會提示reload in gbk。
"""

"""
參考:
1. csdn博客 https://blog.csdn.net/Deft_MKJing/article/details/79460485
2. 廖雪峯的教程-編碼 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431664106267f12e9bef7ee14cf6a8776a479bdec9b9000
"""


# 字符編碼
# 引題: 在windows資源管理其中新建 含有中文的txt文件,win上的文本文件應用正常打開,但是pycharm中打開中文亂碼。mode(模式)
file = open('chinese_gbk.txt',mode= 'r', encoding='gbk')
print(file.readline())
print(file.readline())
print(file.readline())
print(file.readline())
print(file.readline())

"""
open():  arg1文件名,arg2 模式, encoding 編碼 。
encoding參數如果沒有寫,默認隨系統,windows系統默認編碼爲gbk,linux 、mac系統上的默認編碼爲utf-8。

編碼 encode:計算機中存儲的是二進制(0、1),我們平時用的看到的是英文字符、中文字符、圖片、視頻、word文檔,所以這些內容需要經過規則轉換成二進制才能存儲。這個過程叫編碼。場景:寫文件,傳輸信息。

解碼 decode: 解碼是編碼逆運算,講二進制轉換爲我們平時看到的文字、圖片。
本節課討論純文本文件的編解碼,圖片視頻word文檔的編碼規則複雜不討論。 

(瞭解 爲什麼二進制):計算機通過電壓高低判斷信息,如果電壓區間太接近的話(1v 表示1,2v表示2 ...) ,可能由於電壓不穩導致數據易出錯和檢測困難。所以計算機發明者採用二進制表示低電壓0和高電壓1兩種狀態。

字節:衆多的0、1,爲了存儲表示方便和更好的可讀性。規定每8位二進制數字組成一個字節byte。形如 01010101 。字節是最基本的信息單位。

"""

"""
(瞭解)
引題:編碼就好像近代戰爭,傳輸的信息爲了保密和易於傳輸。將原始信息(明文)經過特定規則轉換加密信息(密文)。傳輸密文。友軍收到密文後按相同規則逆向解讀出原始信息。示例 'abc' 編碼→ '123' 解碼→ 'abc'。  

編碼規則歷史:
信息經過編碼成二進制再存到硬盤當中。計算機只認識二進制01,基本信息單位是8位01組成的字節。
首先對容量單位有個大概認識,
1byte = 8bit           一個字節8位(比特) 形如01010101   寬帶50mbps
1kb = 1000byte              一個幾十行的py文件大小爲3kb
1Mb = 1000kb                一首mp3個區大概5Mb左右              
1GB = 1000Mb = 1000000kb    一個電影大概2G左右,固態硬盤大約250G
1TB = 1000G                 一個大容量機械硬盤3Tb

計算機早期內存、硬盤容量小且昂貴。科學家思考,我要在計算機中存儲a A 0 1 +
常見字母、數字、運算符。想出了一套編碼方式ascii(美國信息交換標準代碼)。
ascii編碼:用8位二進制,也就是1byte字節,來表示常見英文大小寫、數字定義表示出來。2的8次方一共有256種可能,足夠表示出常見大小寫字母、數字、運算符、部分特殊符號。例如01100001 代表字母a。

後來計算機漸漸發展,傳到了國外,中國、韓國、日本、歐洲等。
中國大陸的科學家爲了使用計算機,爲了存儲漢字,也發明了一套編碼gb2312。
GB2312:漢字有幾萬種,一個字節256種排列不夠,所以用兩個或更多字節存儲漢字。這套編碼方式可以編兩萬個漢字。
GB18030: GB2312發現不夠用,繁體字特殊字符。所以人們補充新標準,可以編碼7萬多漢字。
上面兩種具體編碼方式都屬於GBK編碼。

與此同時,中國臺灣省、日本、韓國等等其它國家都研究出了自己國家的編碼方式。Erxxx。
全世界有很多套編碼方式,自己國家網站和軟件可以使用,但跟其它使用時經常由於編解碼方式不統一而出現亂碼錯誤,不利於軟件知識在世界範圍內的溝通交流。編碼方式混亂。

出現亂碼的原因在於編碼和解碼不匹配。比如臺灣某網站用某編碼方式編繁體字,你用電腦打開,電腦默認用gbk解碼,由於規則不對應,所以亂碼。  例如編碼規則1 “abc ... 對應 123...” 編碼規則2“abc ...對應567 ",這樣信息'abc'經規則1轉換後爲'123', '123'經規則2解碼後錯誤出現亂碼。

爲了改變這種混亂的編碼狀況,計算機的硬盤價格開始降低容量增大,一個國際組織定義了一套統一的編碼方式,Unicode (union)。unicode編碼方式用4個字節進行編碼,2的32次方42億多種可能,可以把所有國家的文字都編碼進去(俗稱萬國碼),還包括特殊字符(希臘字母、數學字符),還包括emoji表情圖。

但是用unicode編碼後,還有一些問題。一是計算機接收到了4個字節,到底是ascii編碼的4個字符還是unicode編碼的1個字母,二是純英文信息的話,unicode編碼佔用磁盤體積將是ascii編碼的4倍,浪費大。ascii編碼的字母a的二進制爲01100001 , unicode編碼兼容ascii編碼,字母a第一個字節跟ascii編碼一致,其它三個字節填充0,最終unicode編碼的a是 00000000 00000000 00000000 01100001。

爲了避免上述缺點,提供了幾種優化後的存儲方式,比如utf-8、utf-16、utf-32。目前最常用的utf-8。
utf-8使用變長1-4個字節存儲信息,比如上面unicode編碼的a,只存儲有用的一個字節,而當遇到中文時,用2-3字節來存儲,這樣的話既保證兼容,又能以較小的存儲空間存儲。
unicode是一種編碼方式、編碼思想,utf-8是unicode一種具體的實現方法。


"""


"""
# py2和py3編碼區別
python2 默認ascii編碼,如果.py文件中出現中文,系統嘗試用ascii去編碼中文,就彙報超出編碼範圍錯誤。
所以要在.py文件第一行需要顯示聲明編碼方式  # coding='utf-8'    # -*- encoding:utf-8 -*- 

python3 默認unicode編碼。程序中字符串其實都先轉換成中間產物unicode編碼,形如'\u4e2d'。
"""


"""
pycharm相關
設置/editor/file encoding  ,建議保持默認設置或都設置爲utf-8。當pycharm打開文件或項目出現亂碼時,調整編碼方式爲gbk或utf-8。
pycharm編輯器中new file,用utf-8編碼。
"""

"""
編解碼相關錯誤:
1)文件本身是gbk(windows記事本創建的txt),用utf-8解碼。
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 46
2) 文件本身是gbk或utf-8編碼,包含中文,但解碼時用ascii。
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc8 in position 46: ordinal not in range(128)
3)嘗試用ascii去編碼中文,python2中常見錯誤
UnicodeEncodeError: 'ascii' codec can't encode character '\u4e2d' in position 0: ordinal not in range(128)
"""

"""
關於操作系統:
windows操作系統默認gbk;macOS和linux默認的utf-8。
windows記事本默認英文ascii、中文gbk;但win上的pycharm、sublime默認utf-8。
所以平時新建文件建議使用pycharm或sublime。

1)修改源文件:windows記事本另存爲的時候可以修改編碼爲utf8。
2)修改解碼方式:pycharm打開一個gbk文件時會提示reload in gbk。
"""

"""
參考:
1. csdn博客 https://blog.csdn.net/Deft_MKJing/article/details/79460485
2. 廖雪峯的教程-編碼 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431664106267f12e9bef7ee14cf6a8776a479bdec9b9000
"""

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章