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