1. 什么是字符編碼
??字符編碼是指一套將真實(shí)世界里的字母/字符與計(jì)算機(jī)的二進(jìn)制序列進(jìn)行相互轉(zhuǎn)化的規(guī)則。
2. 拉丁字符
- 基礎(chǔ)拉丁字符:
二十六個(gè)字母、數(shù)字和常用的標(biāo)點(diǎn)符號(hào)。 - 派生拉丁字符:
如希臘字母等 - 完整意義的拉丁字符:
前兩者結(jié)合
3. ASCII
??ASCII的全稱(chēng)是American Standard Code for Information Interchange(美國(guó)信息交換標(biāo)準(zhǔn)代碼)。
??ASCII編碼也只支持基礎(chǔ)拉丁字符。ASCII的設(shè)計(jì)也很簡(jiǎn)單,用一個(gè)字節(jié)(8個(gè)位)來(lái)表示一個(gè)字符,并保證最高位的取值永遠(yuǎn)為'0'。即表示字符含義的位數(shù)為7位,不難算出其可表達(dá)字符數(shù)為27 =128個(gè)。這128個(gè)字符包括95個(gè)可打印的字符(涵蓋了26個(gè)英文字母的大小寫(xiě)以及英文標(biāo)點(diǎn)符號(hào)能)與33個(gè)控制字符(不可打印字符)。
??由于存在大量派生拉丁字符,因此有許多其他編碼規(guī)則。如歐洲的ASCII等。
4.中文編碼
??常見(jiàn)的中文編碼有GB2312(與UTF-8不兼容),該編碼用兩個(gè)字節(jié)表示中文,對(duì)于基本拉丁字符使用一個(gè)字節(jié),兼容ASCII。
5.Unicode
??Unicode是將全世界字符都統(tǒng)一的字符編碼規(guī)則。采用四個(gè)字節(jié)表示一個(gè)字符,能夠表示將近21億左右的字符數(shù)量。
??Unicode編碼下有許多問(wèn)題,如對(duì)于基本拉丁字母和漢字來(lái)說(shuō)十分浪費(fèi),因?yàn)榍叭齻€(gè)或兩個(gè)字符均是0。而Unicode碼的一些實(shí)現(xiàn)方式能夠解決部分問(wèn)題,如UTF-8。UTF-8是Unicode的一種實(shí)現(xiàn)方式,而Unicode是一個(gè)統(tǒng)一標(biāo)準(zhǔn)規(guī)范,Unicode的實(shí)現(xiàn)方式除了UTF-8還有其它的,比如UTF-16等。
??下面簡(jiǎn)單介紹一下UTF-8的編碼規(guī)則:
- 規(guī)則1:對(duì)于單字節(jié)字符,字節(jié)的第一位為0,后7位為這個(gè)符號(hào)的Unicode碼,所以對(duì)于拉丁字母,UTF-8與ASCII碼是一致的。
- 規(guī)則2:對(duì)于n字節(jié)(n>1)的字符,第一個(gè)字節(jié)前n位都設(shè)為1,第n+1位為0,后面字節(jié)的前兩位一律設(shè)為10,剩下沒(méi)有提及的位,全部為這個(gè)符號(hào)的Unicode編碼。
通過(guò),根據(jù)以上規(guī)則,可以建立一個(gè)Unicode取值范圍與UTF-8字節(jié)序表示的對(duì)應(yīng)關(guān)系,如下表
unicode_utf8.png
??舉例來(lái)說(shuō),’微’的Unicode是’\u5fae’,二進(jìn)制表示是”00000000 00000000 01011111 10101110“,其取值就位于’0000 0800-0000 FFFF’之間,所以其UTF-8編碼為’11100101 10111110 10101110’ (加粗部分為固定編碼內(nèi)容)。
6. ANSI編碼
??ANSI是Windows的默認(rèn)編碼方式,針對(duì)英文使用ASCII,針對(duì)中文使用GB2312。
7.UTF-8的BOM
??BOM的全稱(chēng)是Byte Order Mark,BOM是微軟給UTF-8編碼加上的,用于標(biāo)識(shí)文件使用的是UTF-8編碼,即在UTF-8編碼的文件起始位置,加入三個(gè)字節(jié)"EE BB BF"。這是微軟特有的,標(biāo)準(zhǔn)并不推薦包含BOM的方式。采用加BOM的UTF-8編碼文件,對(duì)于一些只支持標(biāo)準(zhǔn)UTF-8編碼的環(huán)境,可能導(dǎo)致問(wèn)題。
8. 為什么數(shù)據(jù)庫(kù)Latin1字符集(單字節(jié))能存儲(chǔ)中文?
??其實(shí)不管需要使用幾個(gè)字節(jié)來(lái)表示一個(gè)字符,但最小的存儲(chǔ)單位都是字節(jié),所以,只要能保證傳輸和存儲(chǔ)的字節(jié)順序不會(huì)亂即可。作為數(shù)據(jù)庫(kù),只是作為存儲(chǔ)的使用的話,只要能保證存儲(chǔ)的順序與寫(xiě)入的順序一致,然后再按相同的字節(jié)順序讀出即可,翻譯成語(yǔ)義字符的任務(wù)交給應(yīng)用程序。比如’微’的UTF-8編碼是'0xE5 0xBE 0xAE',那數(shù)據(jù)庫(kù)也存儲(chǔ)'0xE5 0xBE 0xAE'三個(gè)字節(jié),其它應(yīng)用按順序從數(shù)據(jù)庫(kù)讀取,再按UTF-8編碼進(jìn)行展現(xiàn)。這當(dāng)然是一個(gè)看似完美的方案,但是只要寫(xiě)入,存儲(chǔ),讀取過(guò)程中岔出任何別的編碼,都可能導(dǎo)致亂碼。
