字元編碼小結

2022-09-04 01:18:08 字數 1318 閱讀 9583

首先需要記住一件事情,那就是計算機中儲存的一定是二進位制數,是浮點,有符號數,還是無符號數或者是**完全取決於你如何處理這些二進位制,即運算規則。這裡只是關心這些二進位制數跟文字之間的關係,也就是不同的二進位制數如何對映到文字的,或者反過來。

有乙個術語用來表示不同的文字和二進位制數之間的關係:字元編碼。簡單的來說字元編碼就是把一堆文字對映到一堆數字的標準。這也就是說同樣乙個二進位制數在不同的字元編碼中就表示不同的數字。例如對於漢字就有gb2312,gbk,gb18030,gb13000,big5等等,所有這些編碼方法都是用於在計算機中儲存漢字,如果檔案使用的編碼和計算機解釋用的編碼不一樣,那就形成了「亂碼」現象。 在漢字的編碼中gb2312最先出現,然後依次出現gbk,gb18030,gb13000,後面的編碼對前面的編碼相容,也就是說同乙個漢字的二進位制數是一樣的。big5是台灣、香港等地使用的字元編碼,和其他的字元編碼是不相容的,同時gb18030相容gbk、gb2312編碼,但是gb13000好像就是unicode的標準,和其他的其他的字元編碼是不相容的。現在考慮另外乙個事情:windows和linux的locale。簡單的來說locale就是用本地的方式來顯示一些資訊,一般來說是時間和貨幣單位等等,當然也包括文字,這是很大的不同。所以locale中的字元編碼決定了預設使用什麼字元編碼來對檔案中的資訊進行解碼,如果相同或者相容還好,不同的話肯定就亂碼了。

但是隨著unicode的出現,這個問題以另一種方式被解決了:使用同乙個字符集,這個字符集包含了所有語言的所有文字,所以大家就不同擔心了。但是新的問題又出現了。unicode為每個字元分配了乙個碼位,可以認為是邏輯上的乙個二進位制數,但是如何在現實中表示則有不同的方法。明顯乙個位元組只有8位,所有當二進位制數的位數大於8時,必然要使用超過乙個位元組來表示,這些不同的位元組之間存在什麼關係呢?這就是utf-8,utf-16,utf-32。utf-8相容ascii,使用變長編碼,這就意味著可以使用c的庫函式來處理utf-8。utf-8對於c語言來說不過是一堆比較怪異的ascii而已。utf-16使用雙位元組,不同表示全部的unicode字元,而且還有大端、小端的區別。在檔案的前兩個位元組中(0xee,0xff)的不同排列所顯示出來。 utf-32,使用四個位元組,可以完全表示ucs,但是用的很少。如果現在所有的檔案都使用utf-8或者utf-16,那麼世界上很多問題就沒了(很明顯不是)。所以經常需要做字元編碼之間的轉碼,可以使用iconv來完成這個操作,使用file命令獲取檔案的原始編碼。如果從小的字符集向大的字符集轉,沒有任何問題,如果從大的字符集向小的字符集轉,有些字元無法表示,就轉換失敗了。對於漢字還有另外乙個特殊的情況。使用file對使用gb2312,gbk,gb18030編碼的漢字檔案進行探測時,返回的是iso-8859這個編碼,這個時候可以直接按照gb18030解碼(對於其他編碼是相容的),可 以獲得正確的結果!

字元編碼小結

1 早期只有127以內的字元 20以內是控制字元。2 後來各國有了自己的編碼,但一般是兩個位元組表示乙個字元 中國 3 unicode 就是解決各國之間衝突的問題,定義了統一的標準。可以65025個字元。這樣英文也是乙個字元兩個位元組,這樣的好處是全世界統一。4 utf 系列其實和unicode可以...

字元編碼小結

ansi ascii american standard code for information interchange 乙個位元組 字元 0 0x32 為控制碼 33 255 為 字元 中 國人民 gb2312 去掉ascii表127之後的定義.規定 乙個小於127的字元意義與原來相同,兩個大於...

字元編碼小結

儲存器位 bit 位元組 byte 字 word 雙字 double word 1 byte 8 bits 1 word 2 bytes 16 bits 1 double word 2 words 4 bytes 32 bits 單位元組來自遠古時代。計算機最初是在美國等國家發明的,所以只需要把英文...