字符集和字符編碼的區別


1、字符,字符集,字符編碼概念

字符:在計算機和電信技術中,一個字符是一個單位的字形、類字形單位或符號的基本信息。即一個字符可以是一個中文漢字、一個英文字母、一個阿拉伯數字、一個標點符號等。

字符集:多個字符的集合。例如GB2312是中國國家標准的簡體中文字符集,GB2312收錄簡化漢字(6763個)及一般符號、序號、數字、拉丁字母、日文假名、希臘字母、俄文字母、漢語拼音符號、漢語注音字母,共 7445 個圖形字符。

字符編碼:字符集中的字符編碼為(映射)指定集合中的某一對象(例如:比特模式、自然數序列、電脈沖),以便文本在計算機中存儲和通過通信網絡的傳遞。

字符集和字符編碼的關系 :
字符集是書寫系統字母與符號的集合,而字符編碼則是將字符映射為一特定的字節或字節序列,是一種規則。通常特定的字符集采用特定的編碼方式(即一種字符集對應一種字符編碼(例如:ASCII、IOS-8859-1、GB2312、GBK,都是即表示了字符集又表示了對應的字符編碼,但Unicode不是,它采用現代的模型)),因此基本上可以將兩者視為同義詞。

2、發展過程

(1)單字節

ASCII(American Standard Code for Information Interchange),128個字符,用7位二進制表示(00000000-01111111即0x00-0x7F);

EASCII(Extended ASCII),256個字符,用8位二進制表示(00000000-11111111即0x00-0xFF)。

當計算機傳到了歐洲,國際標准化組織在ASCII的基礎上進行了擴展,形成了ISO-8859標准,跟EASCII類似,兼容ASCII,在高128個碼位上有所區別。但是由於歐洲的語言環境十分復雜,所以根據各地區的語言又形成了很多子標准,ISO-8859-1、ISO-8859-2、ISO-8859-3、……、ISO-8859-16。
 
(2)雙字節
當計算機傳到了亞洲,256個碼位就不夠用了。於是乎繼續擴大二維表,單字節改雙字節,16位二進制數,65536個碼位。在不同國家和地區又出現了很多編碼,大陸的GB2312、港台的BIG5、日本的Shift JIS等等。
 
注意65536個碼位這種說法只是理想情況,由於雙字節編碼可以是變長的,也就是說同一個編碼里面有些字符是單字節表示,有些字符是雙字節表示。這樣做的好處是,一方面可以兼容ASCII,另一方面可以節省存儲容量,代價就是會損失一部分碼位。
 
GBK(Chinese Internal Code Specification)是 GB2312的擴展(gbk編碼能夠用來同時表示繁體字和簡體字),按理說都屬於雙字節編碼,碼位是一樣的,根本談不上擴展,但實際上是預留空間在起作用。比如下圖為GBK的編碼空間,GBK/1、GBK/2是GB2312的區域,GBK/3、GBK/4、GBK/5是GBK的區域,紅色是用戶自定義區域,白色可能就是由於變長編碼損失的區域了。

 

(3)多字節

當互聯網席卷了全球,地域限制被打破了,不同國家和地區的計算機在交換數據的過程中,就會出現亂碼的問題,即對同一組二進制數據,不同的編碼會解析出不同的字符。

通用字符集UCS(Universal Character Set)

對應兩種編碼:對每一個字符采用四個8比特字節編碼的稱為UCS-4,對每一個字符采用兩個8比特字節編碼的稱為UCS-2。

UNICODE字符集

有多個編碼方式,分別是UTF-8,UTF-16,UTF-32編碼。

   UTF-8:被定義為將代碼點編碼為1至4個字節,具體取決於代碼點數值中有效位的數量。

  

  前128個字符(US-ASCII)需要一個字節。接下來的1,920個字符需要兩個字節進行編碼,其中涵蓋了幾乎所有拉丁字母字母的其余部分,還包括希臘語,西里爾語,科普特語,亞美尼亞語,希伯來語,阿拉伯語,敘利亞語,塔那那語和N'Ko字母以及組合變音詞馬克。剩余基本多語言平面中的字符需要三個字節,其中幾乎包含所有常用字符,包括大多數字符中文,日文和韓文字符。Unicode的其他平面中的字符需要四個字節,其中包括不常見的CJK字符,各種歷史腳本,數學符號和表情符號(象形符號)。

注意:雖然說utf是為了使用更少的空間而使用的,但那只是相對於unicode編碼來說,如果已經知道是漢字,則使用GB2312/GBK無疑是 最節省的。不過另一方面,值得說明的是,雖然utf編碼對漢字使用3個字節,但即使對於漢字網頁,utf編碼也會比unicode編碼節省,因為網頁中包 含了很多的英文字符。

  UTF-16:2個字節

  UTF-32:4個字節

   例:“漢字”對應的數字是0x6c49和0x5b57,而編碼的程序數據是

  

3、什么是BOM

BOM(Byte Order Mark)字節序(字節順序的標識),其實就是用大端還是小端。

 

java中,UTF-8缺省不帶BOM

UTF-8中有一字節的情況,這種情況,就沒有兩端的說法了。至於另外的二,三,四字節情況,以三字節為例,如果你一定要弄出端法,也不是說不可以,比如,小端法就是“小-中-大”,大端法就是“大-中-小”。但現實情況是UTF-8僅僅采用了一種端法,就是大端法。

參考:

https://www.jianshu.com/p/bd7a6c508c33

https://www.cnblogs.com/happyday56/p/4135845.html

https://blog.csdn.net/u012268339/article/details/54694310

https://en.wikipedia.org/wiki/Unicode

https://baike.baidu.com/item/Unicode/750500?fr=aladdin

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM