字符集
· 創建文本檔案默認使用ANSI,就是系統默認編碼方式,中文window系統默認使用GBK編碼方式
1. 位元組
· 這是最基本的概念,位元組是計算存盤容量的一種計量單位,我們知道計算機只能識別1和0組成的二進制位,一個數就是1位(bit),為了方便計算,我們規定8位就是一個位元組
2. 字符
· 字符和位元組不太一樣,任何一個文字或符號都是一個字符,但所占位元組不一定,不同的編碼導致一個字符所占的記憶體不同
· 例如:標點符號+是一個字符,漢字我們是兩個字符,在GBK編碼中一個漢字占2個位元組,在UTF-8編碼中一個漢字占3個位元組
3. 編碼規范
·
所謂字符集其實是一套編碼規范中的子概念,為了顯示字符,國際組織就制定了編碼規范,希望使用不同的二進制數來表示代表不同的字符,這樣電腦就可以根據二進制數來顯示其對應的字符,我們通常就稱呼其為XX編碼,XX字符集,
·
·
例如:GBK 編碼規范,根據這套編碼規范,計算機就可以在中文字符和二進制數之間相互轉換,而使用GBK編碼就可以使計算機顯示中文字符
·
·
編碼規范中的3個子概念
·
o
a. 字庫表
a. 字庫表存盤了編碼規范中能顯示的所有字符,計算機就是根據二進制數從字庫表中找到字符然后顯示給用戶,相當于一個存盤字符的資料庫,
b. 例如:幾乎所有漢字都保存在GBK 編碼規范的字庫表中,所以可以顯示漢字,但法語,俄語并不在其字庫表中,所以GBK不能顯示法語,俄語等不包含在其中的字符,
b. 編碼字符集(字符集)
a. 在一個字庫表中,每一個字符都有一個對應的二進制地址,而編碼字符集就是這些地址的集合,
b. 在ASCII碼的編碼字符集中,字母A的序號(地址)是65,65的二進制就是01000001,我們可以說編碼字符集就是用來存盤這些二進制數的,而這個二進制數就是編碼字符集中的一個元素,同時它也是字庫表中字母A的地址,我們根據這個地址就可以顯示出字母A
c. 結論:字符集和字庫表一一對應,相互轉換,這是電腦識別字符的關鍵
c. 字符編碼(編碼方式)
a. 程式員制定了一套演算法來節省空間,而每種不同的演算法都被稱作一種編碼方式
b. 例如:UTF-8就是一種編碼方式,Unicode是一種編碼規范,此外,Unicode還有UTF-16,UTF-32這兩種編碼方式,不同的編碼方式節約的空間不同
c. 一個較短的二進制數,通過一種編碼方式,轉換成編碼字符集中正常的地址,然后在字庫表中找到一個對應的字符,最終顯示給用戶
常見的編碼規范
1. ASCII碼
· 計算機內部, 所有資訊最終都是一個二進制值, 每一個二進制位(bit)有0和1兩種狀態,因此八個二進制位就可以組合出256種狀態,這被稱為一個位元組(byte),也就是說,一個位元組一共可以用來表示256種不同的狀態,每一個狀態對應一個符號,從00000000到11111111
· 上世紀60年代,美國制定了一套字符編碼,對英語字符與二進制位之間的關系,做了統一規定,這被稱為ASCII碼,一直沿用至今,
· ASCII碼一共規定了28個字符的編碼,這128個符號(包括32個不能列印處理的控制符號),只占用了一個位元組的后面7位,最前面的一位統一規定為0
2. 非ASCII編碼
· 英語用128個符號編碼就夠了,但是用例表示其他語言,128個符號時不夠的,
· 一些歐洲國家就決定,利用位元組中閑置的最高位編入新的符號,這樣一來,這些歐洲國家使用的編碼體系,可以表示最多256個符號
· 但是,不同的國家有不同的字母,因此,哪怕他們都使用256個符號的編碼方式,代表的字符卻不一樣,但是不管怎樣,所有這些編碼方式中,0-127表示的符號是一樣的,不一樣的只是12-255的這一段
· 至于亞洲國家的文字,使用的符號就更多了,一個位元組只能表示256種符號,肯定是不夠的,就必須使用多個位元組表示一個漢字,比如,簡體中文常見的編碼方式是GB2312,使用倆個位元組表示一個漢字,
3. Unicode
· Unicode將世界上所有的符號都納入其中,每一個符號都給予一個獨一無二的編碼,這就是Unicode,就像它的名字表示的,這是一種所有符號的編碼
· Unicode當然是一個很大的集合,現在的規模可以容納100多萬個符號
4. Unicode的問題
· Unicode只是一個符號集,它只規定了符號的二進制代碼,卻沒有規定這個二進制代碼應該如何存盤
· 一個符號的表示至少需要2個位元組,表示其他更大的符號,可能需要3個位元組或者4個位元組,甚至更多
· 就出現了兩個嚴重的問題,如何才能區別Unicode和ASCII?計算機怎么知道三個位元組表示一個符號,而不是分別表示三個符號?
· 第二個問題是,英文字母只用一個位元組表示就夠了,如果Unicode統一規定,每個符號用三個或四個位元組表示,那么每個英文字母前都必然有二到三個位元組是0,這對于存盤起來是極其浪費
· 于是出現了Unicode的多種存盤方式,也就是說有許多種不同的二進制格式,可以用來表示Unicode
· Unicode在很長一段時間內無法推廣,直到互聯網的出現
5. UTF-8
· 互聯網的普及,強烈要求出現一種統一的編碼方式,
· UTF-8就是在互聯網上使用最廣的一種Unicode的實作方式,其他實作方式還包括UTF-16(字符用兩個位元組或四個位元組表示)和UTF-32(字符用四個位元組表示)
· UTF-8是Unicode的實作方式之一
· UTF-8最大的特點,就是它是一種變長的編碼方式,它可以使用1~4個位元組表示一個符號,根據不同的符號而變化位元組長度
· UTF-8的編碼規則:
o
a. 對于單位元組的符號,位元組的第一位設為0.后面7位為這個符號的Unicode碼,因此對于英語字母,UTF-8編碼和HSCII碼是相同的
b. 對于n位元組的符號(n>1),第一個位元組的前n位都設位1,第n+1位設為0,后面位元組的前兩位一律設為10,剩下的沒有提及的二進制位,全部為這個符號的Unicode碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/139683.html
標籤:Python
