目錄
Unicode字符集和編碼
UTF-32
UTF-16
UTF-8(重點:必須掌握)
BOM
ANSI
Unicode字符集和編碼
????????由于各個國家或地區(qū)都根據(jù)使用自己的文字系統(tǒng)制定標準,同一個編碼在不同的標準里表示不一樣的字符,各個標準互不兼容,而又沒有一個標準能夠囊括所有的字符,即無法用一個標準表達所有字符。國際標準化組織(ISO)為解決這一問題,它舍棄了地區(qū)性的方案,重新給全球上所有文化使用的字母和符號進行編號,對每個字符指定一個唯一的編號(ASCII中原有的字符編號不變),這些字符的號碼從0x000000到0x10FFFF,該編號集被稱為Universal Multiple-Octet Coded Character Set,簡稱UCS,也被稱為Unicode。最新版的Unicode標準還包含了表情符號(聊天軟件中的部分emoji表情),可訪問Unicode官網(wǎng)了解:Index。
????????Unicode字符集只是對字符進行編號,但具體怎么對每個字符進行編碼,Unicode并沒指定,因此也衍生出了如下幾種unicode編碼方案(Unicode Transformation Format)。
UTF-32
????????對Unicode字符集編碼,最自然的就是UTF-32方式了。編碼時,它直接對Unicode字符集里的每個字符都用4字節(jié)來表示,轉(zhuǎn)換方式很簡單,直接將字符對應(yīng)的編號數(shù)字轉(zhuǎn)換為4字節(jié)的二進制數(shù)。
????????由于UTF-32把每個字符都用要4字節(jié)來存儲,因此UTF-32不兼容ASCII編碼,也就是說ASCII編碼的文件用UTF-32標準來打開會成為亂碼。
????????對UTF-32數(shù)據(jù)進行解碼的時候,以4個字節(jié)為單位進行解析即可,根據(jù)編碼可直接找到Unicode字符集中對應(yīng)編號的字符。
????????UTF-32的優(yōu)點是編碼簡單,解碼也很方便,讀取編碼的時候每次都直接讀4個字節(jié),不需要加其它的判斷。它的缺點是浪費存儲空間,大量常用字符的編號只需要2個字節(jié)就能表示。其次,在存儲的時候需要指定字節(jié)順序,是高位字節(jié)存儲在前(大端格式),還是低位字節(jié)存儲在前(小端格式)。
UTF-16
????????針對UTF-32的缺點,人們改進出了UTF-16的編碼方式,它采用2字節(jié)或4字節(jié)的變長編碼方式(UTF-32定長為4字節(jié))。對Unicode字符編號在0到65535的統(tǒng)一用2個字節(jié)來表示,將每個字符的編號轉(zhuǎn)換為2字節(jié)的二進制數(shù),即從0x0000到0xFFFF。而由于Unicode字符集在0xD800-0xDBFF這個區(qū)間是沒有表示任何字符的,所以UTF-16就利用這段空間,對Unicode中編號超出0xFFFF的字符,利用它們的編號做某種運算與該空間建立映射關(guān)系,從而利用該空間表示4字節(jié)擴展,感興趣的讀者可查閱相關(guān)資料了解具體的映射過程。
注:?? 五筆:TLHH(不支持GB18030碼的輸入法無法找到該字,感興趣可搜索它的Unicode編號找到)
UTF-8(重點:必須掌握)
????????UTF-8是目前Unicode字符集中使用得最廣的編碼方式,目前大部分網(wǎng)頁文件已使用UTF-8編碼,如使用瀏覽器查看百度首頁源文件,可以在前幾行HTML代碼中找到如下代碼:
????????其中“charset”等號后面的“utf-8”即表示該網(wǎng)頁字符的編碼方式UTF-8。
????????UTF-8也是一種變長的編碼方式,它的編碼有1、2、3、4字節(jié)長度的方式,每個Unicode字符根據(jù)自己的編號范圍去進行對應(yīng)的編碼。它的編碼符合以下規(guī)律:
- 對于UTF-8單字節(jié)的編碼,該字節(jié)的第1位設(shè)為0(從左邊數(shù)起第1位,即最高位),剩余的位用來寫入字符的Unicode編號。即對于Unicode編號從0x0000 0000-0x0000 007F的字符,UTF-8編碼只需要1個字節(jié),因為這個范圍Unicode編號的字符與ASCII碼完全相同,所以UTF-8兼容了ASCII碼表。
- 對于UTF-8使用N個字節(jié)的編碼(N>1),第一個字節(jié)的前N位設(shè)為1,第N+1位設(shè)為0,后面字節(jié)的前兩位都設(shè)為10,這N個字節(jié)的其余空位填充該字符的Unicode編號,高位用0補足。
????????UTF-8解碼的時候以字節(jié)為單位去看,如果第一個字節(jié)的bit位以0開頭,那就是ASCII字符,以單字節(jié)進行解析。如果第一個字節(jié)的數(shù)據(jù)位以“110”開頭,就按雙字節(jié)進行解析,3、4字節(jié)的解析方法類似。
????????UTF-8的優(yōu)點是兼容了ASCII碼,節(jié)約空間,且沒有字節(jié)順序的問題,它直接根據(jù)第1個字節(jié)前面數(shù)據(jù)位中連續(xù)的1個數(shù)決定后面有多少個字節(jié)。不過使用UTF-8編碼漢字平均需要3個字節(jié),比GBK編碼要多一個字節(jié)。
其中FEFF表示大小端格式,不需要看。
"啊"的unicode編號為0x554A,在三字節(jié)范圍內(nèi)。轉(zhuǎn)成二進制為
101 010101 001010
轉(zhuǎn)成UTF-8,從后往前補,第三個字節(jié)10-補01010,第二個字節(jié)10-補010101,第一個字節(jié)1110-補101,由于不滿八位,所以高位補0,即1110-補0101。因此最后轉(zhuǎn)為16進制為E5958A。
BOM
????????由于UTF系列有多種編碼方式,而且對于UTF-16和UTF-32還有大小端的區(qū)分,那么計算機軟件在打開文檔的時候到底應(yīng)該用什么編碼方式去解碼呢?有的人就想到在文檔最前面加標記,一種標記對應(yīng)一種編碼方式,這些標記就叫做BOM(Byte Order Mark),它們位于文本文件的開頭,見下表。注意BOM是對Unicode的幾種編碼而言的,ANSI編碼沒有BOM。
由于帶BOM的設(shè)計很多規(guī)范不兼容,不能跨平臺,所以這種帶BOM的設(shè)計沒有流行起來。Linux系統(tǒng)下默認不帶BOM。
ANSI
????????ANSI是由微軟定義的一種編碼格式,ANSI跟操作系統(tǒng)的編碼格式是一致的。如果我們電腦的操作系統(tǒng)是簡體中文(GBK)編碼的,選擇ANSI就相當于選擇GBK;如果電腦操作系統(tǒng)是港臺地區(qū)的,操作系統(tǒng)編碼就是繁體中文(BIG5),那么ANSI就為BIG5。文章來源:http://www.zghlxwxcb.cn/news/detail-589171.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-589171.html
到了這里,關(guān)于LCD-STM32液晶顯示中英文-(6.unicode字符集)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!