字符集與字元編碼

2022-09-05 01:45:11 字數 3833 閱讀 6287

目錄

字符集和字元編碼

unicode字符集

utf-8

utf-16

ascii碼

中文字符集(gbk/gb2312/gb18030)

字符集

字符集只是乙個規則集合的名字,

字符集 = 字型檔表(character repertoire)+ 編碼字符集(coded character set)+ 字元編碼(character encoding form)

字型檔表

字型檔表是乙個相當於所有可讀或者可顯示字元的資料庫,字型檔表決定了整個字符集能夠展現表示的所有字元的範圍。

編碼字符集(簡稱字符集,如unicode、ascii)

編碼字符集,用乙個編碼值code point來表示乙個字元(即該字元在子庫表中的位置),這個值稱為字元對應於編碼字符集(如:unicode、ascii)的序號。

字元編碼

字元編碼,是編碼字符集和實際儲存數值之間的轉換關係。字元,是根據字元編碼方案轉換為乙個二進位制數值儲存在計算機中的。

所以,字元編碼是定義在字符集上的對映規則。(字元-------->計算機中的實際儲存值)

注意: 編碼字符集unicode,有utf-8、utf-16、utf-32等多種字元編碼

編碼字符集ascii,本身就是編碼字符集,又是字元編碼

編碼字符集gb2312,只有euc-cn一種字元編碼

為了解決不同國家ansi編碼的衝突問題,unicode應運而生:如果全世界每乙個符號都給予乙個獨一無二的編碼,那麼亂碼問題就會消失。這就是unicode,就像它的名字表示的,這是一種所有符號的編碼。 

unicode只是乙個字符集,用 0-0x10ffff(0-1114111) 來對映全球各國的語言文字,它只規定了符號的二進位制**,並沒有規定這個二進位制**應該如何儲存。比如,漢字「 嚴 」的unicode的16進製表示是4e25,轉換成二進位制是 100111000100101 ,有15位,需要用到2個位元組。還有其他更大的符號,有可能需要3個或者4個位元組。但是英文本母只用乙個位元組表示就夠了,如果unicode統一規定,每個符號用4個位元組表示,那麼每個英文本母有3個位元組是空的,這對於資源來說是非常浪費的。

這就出現了後來的utf8和utf16編碼,他們規定了字元如何儲存!

utf-8是unicode字符集下的字元編碼。他規定了字元應該如何儲存。utf-8最大的乙個特點就是它的一種變長的編碼方式。最新版的utf-8中,它使用 1~6 個位元組表示乙個符號,根據不同的符號而變化位元組長度。

為了更好的理解後面的實際應用,我們這裡簡單的介紹下utf-8的編碼實現方法。即utf-8的物理儲存和unicode序號的轉換關係。 utf-8編碼為變長編碼。最短編碼單位(code unit)為乙個位元組,最長編碼單位6個位元組,用1-6個位元組描述乙個字元。乙個英文本元佔1位元組,乙個中文佔2個或者3個位元組,有的中文佔4個位元組。

具體每個位元組的特徵可見下表,其中x代表序號部分,把各個位元組中的所有x部分拼接在一起就組成了在unicode字型檔中的序號

我們分別看從乙個位元組到三個位元組的utf-8編碼例子:

我們可以得到以下規律:

utf-16編碼採用2個位元組代表乙個字元,英文和中文都是佔兩個位元組

當指定utf-16編碼裡需指定大小端:utf-16be 、utf-16le 、utf-16

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

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

ascii碼一共規定了128個字元的編碼,比如空格「space」是32(二進位制00100000),大寫的字母a是65(二進位制01000001)。這128個(0~127)符號(包括32個不能列印出來的控制符號),只占用了乙個位元組的後面7位,最前面的1位統一規定為0

gb2312:中文字符集,包含ascii字符集。ascii部分用單位元組表示,剩餘部分用雙位元組表示。

gbk:gb2312的擴充套件,完整包含了gb2312的所有內容。

gb18030:gbk字符集的超集,常叫大漢字字符集,也叫cjk(chinese,japanese,korea)字符集,包含了中、日、韓三國語言中的所有字元。

gbk編碼,是在 gb2312-80 標準基礎上的內碼擴充套件規範,使用了雙位元組編碼方案,其編碼範圍從8140至fefe(剔除xx7f),共23940個碼位,共收錄了21003個漢字,完全相容gb2312-80標準,支援國際標準iso/iec10646-1和國家標準gb13000-1中的全部中日韓漢字,幷包含了big5編碼中的所有漢字。gbk編碼方案於2023年10月制定, 2023年12月正式發布。

乙個英文佔乙個位元組的空間,乙個中文佔兩個位元組的空間

ansi編碼是一種對ascii碼的拓展:ansi編碼用 0x00~0x7f (0-127) 範圍的1 個位元組來表示 1 個英文本元,超出乙個位元組的 0x80~0xffff(128-65535) 範圍來表示其他語言的其他字元。也就是說,ansi碼僅在前128(0~127)個與ascii碼相同,之後的字元全是某個國家語言的所有字元。值得注意的是,兩個位元組最多可以儲存的字元數目是2的16次方,即65536個字元,這對於乙個語言的字元來說,絕對夠了。還有ansi編碼其實包括很多編碼:中國制定了gb2312編碼,用來把中文編進去。另外,日本把日文編到shift_jis裡,南韓把韓文編到euc-kr裡,各國有各國的標準。受制於當時的條件,不同語言之間的ansi碼之間不能互相轉換,這就會導致在多語言混合的文字中會有亂碼。 在中國,ansi是gbk編碼,在日本是shift_jis編碼,不同國家,ansi代表不同的編碼

話說計算機是由美國佬搞出來的嘛,他們覺得乙個位元組(可以表示256個編碼)表示英語世界裡所有的字母、數字和常用特殊符號已經綽綽有餘了(其實ascii只用了前128個編碼)。後來歐洲人不幹了,法國人說:我需要在小寫字母加上變音符號(如:é),德國人說:我也要加幾個字母(ä ä、ö ö、ü ü、ß)。於是,歐洲人就將ascii沒用完的編碼(128-255)為自己特有的符號編碼(後來稱之為「擴充套件字符集」)。等到我們中國人開始使用計算機的時候,尼瑪,256個編碼哪夠?我泱泱大中華,漢字起碼也得n多萬吧,就連小學生都得要求掌握兩三千字。國標局最後拍板:乙個位元組不夠,那我們就用多個位元組來為漢字編碼吧,但是,國情那麼窮,位元組那麼貴,三個位元組傷不起,那就用倆位元組吧,先給常用的幾千漢字編個碼,等以後國家強盛了人民富裕了,咱再擴充套件唄---於是gb2312就產生了。台灣同胞一看,尼瑪,全是簡體字,還讓不讓我們寫繁體字的活了,於是台灣同胞也自己弄了個繁體字編碼---大五碼(big-5)。同時,其它國家也在為自己的文字編碼。最後,微軟苦逼了:顧客就是上帝啊,你們的編碼我都得滿足啊,這樣吧,賣給美國國內的系統預設就用ascii編碼吧,賣給中國人的系統預設就用gbk編碼吧,賣給南韓人的系統預設就用euc-kr編碼,...但是為了避免你們誤會我賣給你們的系統功能有差異,我就統一把你們的預設編碼都顯示成ansi吧。

所以,ansi編碼在不同國家代表不同編碼!

字符集與字元編碼

字符集 字符集是各種文字和符號的總稱,也就是多個字元的集合,而常見的字符集有 ascii字符集 iso 8859字符集 gb 2312字符集 big 5字符集 gbi 8030字符集 unicode字符集等。計算機要能夠識別和儲存各種字元,就要對各種字符集進行字元編碼。字元編碼 編碼和字符集不同,字...

字符集與字元編碼

字符集 charset 是乙個系統支援的所有抽象字元的集合。字元是各種文字和符號的總稱,包括各國家文字 標點符號 圖形符號 數字等。常用字符集 ascii 英語字符集,1位元組,前127是英文 數字,127 255是特殊符號 gb x gb2312,gb18030 字符集,2位元組,包含ascii前...

字符集與編碼

前言 今天notepad 檢視測試傳過來的乙個log,開啟後竟然有部分亂碼,無法檢視完整資訊,嘗試更改編碼後仍未能解決,同事告知使用瀏覽器開啟或許可以,於是搗鼓一下,使用瀏覽器開啟並選擇編碼unicode utf 8 後終於正常顯示,順利解決問題。亂碼顯示的問題以前也經常遇到,從未認真對待過,剛好稱...