字元編碼研究

2021-07-07 07:22:07 字數 2290 閱讀 9526

應用開發中,經常會遇到亂碼的問題,對於新手尤其如此。為了解決亂碼問題帶來的困擾,特整理一下字元編碼的相關知識,從根本上杜絕亂碼的出現。

一,相關概念

在計算機的世界中,所有的資訊都是由01組成的二進位制資訊,當然也包含字元。字元是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。那麼如何將這些字元轉換成計算機理解的二進位制資訊就是編碼過程,如何將二進位制資訊轉換成我們理解的字元就是解碼過程。比如怎麼把「漢字」轉換成二進位制,怎麼把0xbaba解釋成字元。

字符集(charset)簡單的說就是字元的集合,集合中的每個字元都有乙個碼位值表示它在字符集中的座標,通過這個座標就可以唯一的確定乙個字元。常見的字符集有ascii字符集、gb2312字符集、big5字符集、gb18030字符集、unicode字符集等等。由於世界上存在非常多種的語言、文字,所以字符集也是百花齊放、形態各異。

字元編碼(character encoding)就是字符集中的字元與計算機中的二進位制資訊互相轉換的規則。

舉個栗子,unicode字符集包含了世界上的所有字元,而utf-8就是基於unicode字符集的字元編碼。當然我們也可以直接用字符集中的碼位值表示字元編碼,比如ascii字符集中,字元a通過編碼後的值為65,而a在ascii字符集中的碼位值就是65。一會兒再對unicode和utf-8做個

詳細的例子,就可以更好的理解這個問題了。

有的地方把字符集與字元編碼作為同乙個概念,這樣也是合理的,因為用他們都可以描述字元與二進位制資訊的對映關係,也就可以進行編譯碼。

二,字符集之間的關係

1.計算機誕生於美國,所以他的「母語」就是英語。英文中一共有26個字母,算上大小寫以及標點符號不足128個,以乙個位元組表示足夠,這就是ascii編碼。ascii 編碼對於我們再熟悉不過了,具體每個字母對應碼位是多少很多人都能背下來,它是全世界通用的一種編碼方式,http協議就是基於ascii字符集的。

2.ascii字符集只能表示128個字元,但是美國在歐洲的朋友們可不都是講英語的,他們需要一些其他字元(認真你就輸了),所以就有了我們熟悉的iso-8859-1,這是好多平台的預設編碼。其實iso制定了一系列的標準,它們是 iso-8859-1~iso-8859-15。這些字元編碼都是基於單位元組的,所以最多可以表示256個字元。

3.對於中國這個文化大國,常用的文字就有兩千多,乙個位元組肯定是表示不過來的。於是我們就有了自己的編碼gb2312,它是雙位元組編碼的,包括6763個漢字和682個其它符號。

4.後來,又對gb2312字符集做了擴充套件,於是有了gbk。gbk是相容gb2312的,也就是說gb2312中的編碼方式在gbk中被保留了下來。

5.再然後,感覺gbk中還是缺少了一些特殊的符號圖形什麼的,於是又對gbk做了擴充套件。擴充套件後的字符集為gb18030,同樣對之前的字符集是相容的。gb18030中幾乎包含了所有少數名族的文字圖案以及特殊符號。

三,unicode,ucs與utf-8

1, 每個語言區域用自己的字符集處理字元資訊是沒有問題的,但是在訪問其它語言的內容就會出現錯誤。於是國際組織就設計出了世界通用的字符集unicode。unicode就是要表示世界上所有的字元,可以把它看成是所有字符集的並集,出現在不同字符集中同樣的字元在unicode中對應乙個編碼。

2,unicode的全稱是"universal multiple-octet coded character set",基於通用字符集的思想有兩種具體的實現,乙個ucs-2和ucs-4。看名字就知道,ucs-2使用的是兩個位元組,而ucs-4使用的是四個位元組。兩個位元組一共可以表示2的16次方,即65536個字元,幾乎可以涵蓋世界上所有的字元了,ucs-2就是最常用的unicode編碼方案。

3,現實中我們經常會用各種聊天工具在網上與他人交流,所以字元就需要在不同的計算機直接傳輸。用兩個位元組表示乙個字元看起來已經非常節省空間且方便使用了,但是它在傳輸中仍然存在確定。首先,對於最常用的英文本母等字元只需要乙個位元組表示就夠了,不需要用兩個位元組,如果所有字元都用兩個位元組傳輸會浪費網路的頻寬而且耗時。其次,如果接收端收到了兩個位元組,那麼是第乙個位元組在高位還是第二個位元組在高位呢(它有一種解決方法就是新增bom)?utf-8編碼徹底解決了上面的兩個問題,它是一種變長的編碼方式,越常用的字元占用的位元組越少。與哈夫曼編碼的思想相同,所以對同樣的一段文字編碼,utf-8編碼後的期望位元組數更少。

表中就是ucs-2到utf-8的編碼規則:

ucs-2編碼(16進製制)

utf-8 位元組流(二進位制)

0000 - 007f

0******x

0080 - 07ff

110***xx 10******

0800 - ffff

1110***x 10****** 10******

1,2,

字元編碼 使用c 研究

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

字元編碼 使用c 研究

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

編碼問題研究

由於在windows下預設是gb編碼,而我的vim預設是utf 8 gedit預設也是utf 8 所以開啟會成亂碼。修改了一下配置檔案,使vi支援gb編碼就好了。vi vimrc let termencoding encoding set fileencodings utf 8,gbk wq 再 次...