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)。

(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