2 python的編碼
3 編碼的延伸
簡單來說,從明文到編碼文字,稱為"編碼"。從編碼文字解發布到明文,稱為"解碼"。
ascii: 計算機儲存資料是用了乙個個電阻單元,開啟為:1,關閉為: 0,稱為1bit,也正為1位。最早,美國人用八個電阻去表達字元符,也就能表達256個不同的字元,英文單詞才有26個,加上一些特殊字元也綽綽有餘了。如字元a -> 00010001。
ansi: 擴充套件的ascii碼,早期的字元剛滿128個。所以第8位往往是0。為了表示更多字元,有擴充套件了第八位。共可表達256位字元,其中包含了一些拉丁文。
gb2312: 在中國日新月異的發展當中,計算機編碼也傳遞了過來。但是,之前的編碼不能表達漢字。所以2023年,我國自主研發了gb2312編碼。把第8位對應的拉丁文刪除。將二進位制數值小於127的字元意義不變,仍表示英文本元和一些特殊字元;但將大於127的字元,於另一大於127的字元自由組合,表示為乙個特定的漢字。簡單來說,就是兩個大於127的位元組表示乙個中文漢字。共能表示7000多個漢字。其也算是對ascii編碼的擴充套件。
gbk與gb18030: 但是7000個漢字,是不夠用的。所以,之後擴充套件為,當第乙個位元組大於127,後接隨意位元組,就表示為乙個漢字。在gb2312的基礎上,又增加了20000多個漢字(包含一些繁體字和符號)。
unicode: 該編碼用兩個位元組表示乙個字元,256*256 = 65536 個。 共可以表示6萬5千多種不同的字元,足以可以表示全世界所有的有意義字元(包括甲骨文)。你可以向我一樣,稱它為「unique code」,天下獨一的編碼。
utf-8: 有了unicode,為什麼還發展出新的編碼了呢。是因為,本來乙個位元組都可以儲存所有26個英文本元,為什麼還非要兩個位元組,造成儲存冗餘呢。所以,美利堅的專家們針對此問題創造了自由度較高的utf-8。它可以是用1-4個位元組來表示乙個字元。當乙個字元的二進位制長度小於127,就盡可能用ascii碼來表達。根據不同的符號型別,來變換長度。常用中文字元佔3個位元組(2w+),一些難寫的字佔4個位元組。
unicode的編碼:
str = 'u are a 小狗 』 # 這是我們可以看懂的一句明文,包含英文、漢字
以下為unidode編碼,\u為識別符號,後加4個16進製制的數字:
以乙個英文本母及乙個漢字為例:
u: 0055
狗: 5c0f
上述因為是16進製制,為什麼要選擇16進製制?這是因為乙個16進製制的數字能表達所有4位二進位制的數字,兩個16進製制的數字能表示乙個位元組的大小,記錄長度從8位縮短至2位,減少記錄冗餘。那麼轉換成二進位制: 進製轉換器
u: 00000000 01010101
狗:01011100 00001111
不難發現,unicode對於英文及漢字都是用兩個位元組來儲存的。
有時候,我們發現u的unicode碼也可以寫成…。其實\u開頭和開頭是一樣的,\u代表unicode16進製制的寫法,表示10進製的寫法。
0x開頭代表十六進製制 \u則代表unicode編碼 \x對應的是utf-8編碼的資料utf-8的編碼:
u: 01010101 狗: 00000001 00011001 00100001
英文本元延用了ascii的規則,用乙個位元組表示。但是中文字元用2~4個位元組來表示。因為程式多是用到了英文本元。所以,當程式文字量大的時候,utf-8比unicode能節省許多儲存空間。
python作為一種供計算機使用者編寫程式的高階語言。當我們用其書寫一些明文的時候,它內部會幫我們轉成預設的編碼字元,提供給計算機處理。所以,我們要了解python2\python3的預設編碼以及我們可以做出的修改。
1> py2預設編碼型別認為ascii:
預設是ascii編碼,str型別。但是當ide無指定utf-8、ansi等編碼文字的時候,會報錯,因為ascii編碼無法表示漢字字元。
加上抬頭:
# *-* coding: utf-8
就是預設當使用ide寫字串的時候,編碼文字是utf-8:
2> py2加u,顯示unicode編碼:
可以發現,ascii方式的字串被py2標記為str型別,unicode方式的字串被py2標記為unicode型別,其他外部使用的編碼,py2也標記為str型別。
那麼如何轉換成其他編碼呢?
編碼是給機器看的,明文是給人看的,print就是直接列印當前編碼的明文。
發現,編碼成gbk會亂碼,這是因為兩碼不通的緣故。
**3> 總結:**py2的字元型別就設定為兩種: str及unicode型別。其他如utf-8、gbk顯示也是預設的str字串型別,被轉換成幾個ascii碼。但是其實真正的ascii編碼中是不包含這個編碼的明文的。
4> 解碼decode: 就是將編碼轉換成明文。由於,每種編碼方式都有不同的編碼規則,所以就要選用對應的解碼規則。不然就會報錯:
正確解碼:
&emsp:1> py3也有兩種型別,我覺得這兩種型別更符合人的認知意識,就是明文本串和位元組表示符:
str就是明文本串,bytes就是位元組表示符(多進製來表示)。
總之py3是更符合人的思維邏輯的。encode就是編碼,是機器能讀懂的編碼文字。decode就是解碼,解發布人能看懂的明文。
我覺得,在python2互動輸入框中輸入字串的時候,不用ide、不加u則會報錯,因為預設編碼為ascii碼,沒有中文字元。加u編碼是unicode,直接解碼顯示為明文。輸入明文,就預設解碼顯示明文了,內部編碼型別是unicode。
在python3中,也有兩種字串格式型別了,但是該str是指明文字串,bytes是指編碼的位元組表示符。
其實,當我查閱資料的時候,有些人講:其實許多軟體內部都把預設儲存編碼選擇為unicode,這是因為unicode又被稱為萬國碼,因為它能儲存6w5千多個符號,漢字、英文、拉丁文、日文等盡收囊中。包羅永珍、相容性最佳。當我們把軟體的顯示編碼除錯為ansi、utf-8的時候,在儲存時,都會先轉換為unicode,再進行儲存。
究竟內部儲存編碼型別,為unicode或者是其他gbk、ansi、utf-8等都是無所謂的。我們只需要知道:
py2預設編碼解碼方式為ascii,py3為utf-8。通過以下方式可以查詢:
import sys
print(sys.getdefaultencoding())
指這個.py檔案是以utf-8進行儲存的。
# *-* coding:utf8
是的,這就是因為如果py2直譯器去執行乙個utf8編碼的檔案,就會以預設地ascii去解碼utf8,一旦程式中有中文,自然就解碼錯誤了,所以我們在檔案開頭位置宣告 #coding:utf8,其實就是告訴直譯器,你不要以預設的編碼方式去解碼這個檔案,而是以utf8來解碼。而py3的直譯器因為預設utf8編碼,所以就方便很多了。
在我們儲存一種文字檔案,並用python自帶的f = open(file)去開啟的時候,會發現f的內容為亂碼或者報錯。這是因為,檔案file可能是ansi的編碼,但是python3預設的編碼解碼型別是utf-8,所以就會出現亂碼。或者,windows作業系統預設為gbk解碼方式,開啟utf-8檔案報錯。
這時候,就可以指定編碼方式,f = open(file, encoding = 『utf-8』)
計算機編碼 編碼
原碼 a.規則 最高位為符號位,0為正數,1為負數,剩餘位表示資料 b.例 95 原 0101 1111 原 77 原 11001101 原 c.特點 區分正負零 缺陷 0 原 0000 0000 0 原 1000 0000 原碼可能出錯 1 原 1 原 1000 0010 原 2 d d.範圍 8...
計算機編碼
來自 阮一峰 一下對自己有用的精簡部分 1.ascii碼 在計算機內部,所有的資訊最終都表示為乙個二進位制的字串。每乙個二進位制位有0和1兩種狀態,因此八個二進位制位就可以組合出256種狀態,這被稱為乙個位元組 byte 也就是說,乙個位元組一共可以用來表示256種不同的狀態,每乙個狀態對應乙個符號...
計算機編碼
很久很久以前,有一群人,他們決定用8個可以開合的電晶體來組合成不同的狀態,以表示世界上的萬物。他們看到8個開關狀態是好的,於是他們把這稱為 位元組 再後來,他們又做了一些可以處理這些位元組的機器,機器開動了,可以用位元組來組合出很多狀態,狀態開始變來變去。他們看到這樣是好的,於是它們就這機器稱為 計...