字符集、字符編碼及應(yīng)用

基本概念

幾個(gè)基本定義

基本定義

不同 ANSI 編碼所規(guī)定的標(biāo)準(zhǔn)是不相同的,因此,對(duì)于一個(gè)給定的多字節(jié)字符串,我們必須知道它采用的是哪一種編碼規(guī)則,才能夠知道它包含了哪些“字符”。而對(duì)于 UNICODE 字符串來(lái)說(shuō),不管在什么環(huán)境下,它所代表的“字符”內(nèi)容總是不變的。

字符集

顧名思義,是表示字符的集合。使用哪些字符。也就是說(shuō)哪些漢字、字母和符號(hào)會(huì)被收入標(biāo)準(zhǔn)中。所包含“字符”的集合就叫做“字符集”。如ASCII、Unicode、ISO 8859、GB 2312、BIG 5、GB 18030等(需要注意的是,其中部分,如ASCII是字符集的同時(shí)也是字符編碼方式)。

字符編碼

以二進(jìn)制數(shù)字對(duì)應(yīng)字符集的字符,規(guī)定每個(gè)“字符”分別用一個(gè)字節(jié)還是多個(gè)字節(jié)存儲(chǔ)、用哪些字節(jié)來(lái)存儲(chǔ),這個(gè)規(guī)定就叫做“編碼”。

幾種字符編碼方式


ASCII(American Standard Code for Information Interchange)

ASCII是基于拉丁字母(羅馬字母)的一套電腦編碼系統(tǒng)。它主要用于顯示現(xiàn)代英語(yǔ),而其擴(kuò)展版本EASCII則可以勉強(qiáng)顯示其他西歐語(yǔ)言。它是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng)(但是有被UniCode追上的跡象),并等同于國(guó)際標(biāo)準(zhǔn)ISO/IEC 646。

需要注意的是,ASCII是單字節(jié)故而只有一種編碼方式,所以ASCII字符集與ASCII編碼沒(méi)有區(qū)分。

ASCII的特點(diǎn):

1. 只能顯示26個(gè)基本拉丁字母、阿拉伯?dāng)?shù)目字和英式標(biāo)點(diǎn)符號(hào)。

2. 一個(gè)字節(jié)存放一個(gè)字符

*拉丁字母(AaBb...)源自希臘字母(ΑαΒβ...)

ASCII表:

ASCII碼表

ANSI編碼

使用0x80~0xFF范圍的2個(gè)字節(jié)來(lái)表示1個(gè)字符,需要注意的是0x00~0x7F之間的字符,依舊是1個(gè)字節(jié)代表1個(gè)字符。


ANSI


ANSI的中國(guó)特化

Unicode編碼

Unicode為各種語(yǔ)言中的每一個(gè)字符設(shè)定了統(tǒng)一并且唯一的數(shù)字編號(hào),以滿足跨語(yǔ)言、跨平臺(tái)進(jìn)行文本轉(zhuǎn)換、處理的要求。計(jì)算機(jī)存放字符串時(shí),改為存放每個(gè)字符在 UNICODE 字符集中的序號(hào)。

UCS
UCS的缺憾
UTF
大小端字節(jié)序
BOM與XML
編碼方式的判斷

SBCS/DBCS/MBCS

這三種都是是編碼的某種類型,而不是某個(gè)特定編碼的名稱。

SBCS(Single-Byte Character Set)

SBCS的所有字符都只用一個(gè)字節(jié)表示,用“0”表示一個(gè)字節(jié)的結(jié)束。如ASCII。

MBCS(Muti-Byte Character Set)

在Windows里的MBCS包含兩種字符類型,由于Windows里使用的多字節(jié)字符絕大部分是兩個(gè)字節(jié)長(zhǎng),MBCS常被DBCS代替。

三者的關(guān)系

Unicode中的UCS-2

MBCS字符可以使用不同長(zhǎng)度的字節(jié)編碼,而UCS-2全部用兩個(gè)字節(jié)編碼,所以Unicode字符也被稱為寬字符。


字符與編碼在程序中的實(shí)現(xiàn)

字符、字節(jié)、字符串
使用方式
再次糾正誤解
所有常見(jiàn)類型釋義

后記

本文是轉(zhuǎn)戰(zhàn)簡(jiǎn)書(shū)后的第一篇文章,權(quán)做暖場(chǎng)。然而即使只做暖場(chǎng)之用但依舊干貨滿滿、誠(chéng)意十足 : D 。

對(duì)字符集、字符編碼及應(yīng)用的梳理緣起使用TinyXML導(dǎo)入內(nèi)容時(shí)那令人心煩的滿屏亂碼。當(dāng)時(shí)感覺(jué)到了來(lái)自字符的深深惡意,好在豺狼來(lái)了咱有槍,三下五除二的搜集資料并整理加上自己的見(jiàn)解便形成此文的原始版本--“字符編碼.vsdx”(相信眼力勁兒好的大家已經(jīng)能感受到那來(lái)自Visio的強(qiáng)硬轉(zhuǎn)(遷)折(移)了)。現(xiàn)在將它放上簡(jiǎn)書(shū),希望能供有需之人解除些困擾。

如果因?yàn)楦袷交靵y影響閱讀,在此先行表示抱歉 : ) 后續(xù)應(yīng)該是會(huì)利用Markdown來(lái)進(jìn)行重新整理的,當(dāng)然那是后話了(因?yàn)槭聞?wù)繁忙,下次更新可以預(yù)見(jiàn)不會(huì)是Near future)。但是待數(shù)月之后我會(huì)將已然整理好的其他內(nèi)容(一些高級(jí)主題)一并放上簡(jiǎn)書(shū)的。

不扯點(diǎn)野棉花那是不符合一貫作風(fēng)的。干貨部分是沒(méi)有夾帶一絲水分的,那么,大家若是時(shí)間有限大可就此截止啦。若是有閑暇,嘿嘿嘿,我就按照吳老師的教誨講點(diǎn)兒小故事以饗大家~

P.S.突然想起那個(gè)整理“字符編碼.vsdx”的晚上,同時(shí)與師兄閑聊,聽(tīng)?zhēng)熜终f(shuō)起他的親身經(jīng)歷。在一個(gè)奇妙的下午,撿到錢的師兄欣喜若狂,這意味著什么?這是命定之子的節(jié)奏??!如此良機(jī)豈可輕易錯(cuò)過(guò),師兄balabala搜集了海量的福彩號(hào)碼,然后噼里啪啦敲好統(tǒng)計(jì)程序,把搜集好的所有數(shù)字組合作為輸入。不出意外,程序咻~的一下算好各種數(shù)字組合出現(xiàn)的頻次??吹浇Y(jié)果的師兄略一思忖并考量到運(yùn)氣加成,對(duì)出現(xiàn)頻次最低的號(hào)碼組合加以個(gè)人理解下以重注。如是,當(dāng)然是萬(wàn)事具備,只等巨額支票啦。

啥?你問(wèn)我結(jié)果?自然是跟歐·亨利的小說(shuō)一樣。但是,你能否感受到師兄的可愛(ài)與對(duì)技術(shù)的那份癡狂呵?

好了,今天就到這兒了。如果有需要原始的Visio版本可以留言索要,干貨部分如有疏漏或是不妥之處懇請(qǐng)批評(píng)指正,在此先行謝過(guò)~


假裝有參考文獻(xiàn)

參考文獻(xiàn)本來(lái)是該有的,但是本文的原始版本寫作時(shí)間距今已久,鏈接遺軼。而作者又不愿耍無(wú)賴,那么先給大家畫(huà)個(gè)餅--數(shù)月之后容我再行校對(duì)補(bǔ)充啦!

最后編輯于
?著作權(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)容

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