字符集和字元編碼

2021-10-09 21:42:00 字數 2938 閱讀 1777

字符集

· 建立文字檔案預設使用ansi,就是系統預設編碼方式,中文window系統預設使用gbk編碼方式

位元組· 這是最基本的概念,位元組是計算儲存容量的一種計量單位,我們知道計算機只能識別1和0組成的二進位制位,乙個數就是1位(bit),為了方便計算,我們規定8位就是乙個位元組

字元· 字元和位元組不太一樣,任何乙個文字或符號都是乙個字元,但所佔位元組不一定,不同的編碼導致乙個字元所佔的記憶體不同

· 例如:標點符號+是乙個字元,漢字我們是兩個字元,在gbk編碼中乙個漢字佔2個位元組,在utf-8編碼中乙個漢字佔3個位元組

編碼規範·

所謂字符集其實是一套編碼規範中的子概念,為了顯示字元,國際組織就制定了編碼規範,希望使用不同的二進位制數來表示代表不同的字元,這樣電腦就可以根據二進位制數來顯示其對應的字元。我們通常就稱呼其為xx編碼,xx字符集。

例如:gbk 編碼規範,根據這套編碼規範,計算機就可以在中文字元和二進位制數之間相互轉換。而使用gbk編碼就可以使計算機顯示中文字元

編碼規範中的3個子概念

oa. 字型檔表

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. 乙個較短的二進位制數,通過一種編碼方式,轉換成編碼字符集中正常的位址,然後在字型檔表中找到乙個對應的字元,最終顯示給使用者

常見的編碼規範

ascii碼

· 計算機內部, 所有資訊最終都是乙個二進位制值, 每乙個二進位制位(bit)有0和1兩種狀態,因此八個二進位制位就可以組合出256種狀態,這被稱為乙個位元組(byte),也就是說,乙個位元組一共可以用來表示256種不同的狀態,每乙個狀態對應乙個符號,從00000000到11111111

· 上世紀60年代,美國制定了一套字元編碼,對英語字元與二進位制位之間的關係,做了統一規定,這被稱為ascii碼,一直沿用至今。

· ascii碼一共規定了28個字元的編碼,這128個符號(包括32個不能列印處理的控制符號),只占用了乙個位元組的後面7位,最前面的一位統一規定為0

非ascii編碼

· 英語用128個符號編碼就夠了,但是用例表示其他語言,128個符號時不夠的。

· 一些歐洲國家就決定,利用位元組中閒置的最高位編入新的符號,這樣一來,這些歐洲國家使用的編碼體系,可以表示最多256個符號

· 但是,不同的國家有不同的字母,因此,哪怕他們都使用256個符號的編碼方式,代表的字元卻不一樣。但是不管怎樣,所有這些編碼方式中,0-127表示的符號是一樣的,不一樣的只是12-255的這一段

· 至於亞洲國家的文字,使用的符號就更多了,乙個位元組只能表示256種符號,肯定是不夠的,就必須使用多個位元組表示乙個漢字,比如,簡體中文常見的編碼方式是gb2312,使用倆個位元組表示乙個漢字。

unicode

· unicode將世界上所有的符號都納入其中,每乙個符號都給予乙個獨一無二的編碼,這就是unicode,就像它的名字表示的,這是一種所有符號的編碼

· unicode當然是乙個很大的集合,現在的規模可以容納100多萬個符號

unicode的問題

· unicode只是乙個符號集,它只規定了符號的二進位制**,卻沒有規定這個二進位制**應該如何儲存

· 乙個符號的表示至少需要2個位元組,表示其他更大的符號,可能需要3個位元組或者4個位元組,甚至更多

· 就出現了兩個嚴重的問題,如何才能區別unicode和ascii?計算機怎麼知道三個位元組表示乙個符號,而不是分別表示三個符號?

· 第二個問題是,英文本母只用乙個位元組表示就夠了,如果unicode統一規定,每個符號用三個或四個位元組表示,那麼每個英文本母前都必然有二到三個位元組是0,這對於儲存起來是極其浪費

· 於是出現了unicode的多種儲存方式,也就是說有許多種不同的二進位制格式,可以用來表示unicode

· unicode在很長一段時間內無法推廣,直到網際網路的出現

· 網際網路的普及,強烈要求出現一種統一的編碼方式。

· utf-8就是在網際網路上使用最廣的一種unicode的實現方式,其他實現方式還包括utf-16(字元用兩個位元組或四個位元組表示)和utf-32(字元用四個位元組表示)

· utf-8是unicode的實現方式之一

· utf-8最大的特點,就是它是一種變長的編碼方式,它可以使用1~4個位元組表示乙個符號,根據不同的符號而變化位元組長度

· utf-8的編碼規則:

oa. 對於單位元組的符號,位元組的第一位設為0.後面7位為這個符號的unicode碼,因此對於英語字母,utf-8編碼和hscii碼是相同的

b. 對於n位元組的符號(n>1),第乙個位元組的前n位都設位1,第n+1位設為0,後面位元組的前兩位一律設為10,剩下的沒有提及的二進位制位,全部為這個符號的unicode碼

字符集和字符集編碼詳解

gb2312 gbk ascii asni unicode utf 8等等,這些字眼非常常見,同時帶來許多的問題。本文只是從理解的角度,說明以上內容的不同含義從而達到區分其用法的目的是夠了的。至於實現方式,可以查閱各自的詳細標準官方文件。先解釋乙個概念,什麼是字符集,嗯,不解釋了,我弄乙個吧 從今以...

字符集和字元編碼

字符集和字元編碼不錯的部落格 字符集 是乙個系統支援的所有抽象字元的集合。字元是各種文字和符號的總稱,包括各國家文字 標點符號 圖形符號 數字等。asicc,unicode,gbk,gb2312等 字元編碼 是一套法則,使用該法則能夠對自然語言的字元的乙個集合 如字母表或音節表 與其他東西的乙個集合...

字元編碼和字符集

計算機中儲存的資訊都是用二進位制數表示的,而我們在螢幕上看到的數字 英文 標點符號 漢字等字元是二進位制數轉換之後的結果。按照某種規則,將字元儲存到計算機中,稱為編碼。反之,將儲存在計算機中的二進位制數按照某種規則解析顯示出來,稱為解碼。亂碼的根本原因 按照a規則儲存,同樣按照a規則解析,那麼就能顯...