字符編碼常識(shí)

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)致亂碼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 字符集和編碼簡(jiǎn)介 在編程中常常可以見(jiàn)到各種字符集和編碼,包括ASCII,MBCS,Unicode等字符集。確切的說(shuō)...
    蘭山小亭閱讀 9,075評(píng)論 0 13
  • UTF-8 編碼提供了一種簡(jiǎn)便而向后兼容的方法, 使得那種完全圍繞 ASCII 設(shè)計(jì)的操作系統(tǒng), 比如 Unix,...
    謝大見(jiàn)閱讀 4,970評(píng)論 0 3
  • 區(qū)間k大數(shù)查詢(xún) 問(wèn)題描述 給定一個(gè)序列,每次詢(xún)問(wèn)序列中第l個(gè)數(shù)到第r個(gè)數(shù)中第K大的數(shù)是哪個(gè)。 輸入格式 第一行包含...
    一只破背包閱讀 572評(píng)論 0 1
  • 深藍(lán)琥珀(上) 深藍(lán)琥珀(中) 滄海心蘇醒過(guò)來(lái)的時(shí)候,清冷的月光正透過(guò)破損的窗戶(hù)照進(jìn)來(lái),地上一片狼藉。 他茫然四顧...
    滄海之心閱讀 565評(píng)論 4 6
  • “輕汗微微透碧紈,明朝端午浴芳蘭。流香漲膩滿(mǎn)晴川。彩線輕纏紅玉臂,小符斜掛綠云鬟。佳人相見(jiàn)一千年?!薄K軾《浣...
    心田一瓣閱讀 564評(píng)論 4 4

友情鏈接更多精彩內(nèi)容