計(jì)算機(jī)是如何存儲(chǔ)數(shù)據(jù)的
在談什么是字符編碼前,我們首先要知道一個(gè)概念,計(jì)算機(jī)是如何存儲(chǔ)數(shù)據(jù)的:
計(jì)算機(jī)是由邏輯電路組成,僅能識(shí)別二進(jìn)制的電脈沖信號(hào)粱坤,二進(jìn)制位的狀態(tài)用0和1表示。計(jì)算機(jī)中最小的存儲(chǔ)單位為一個(gè)比特瓷产,存放一個(gè)二進(jìn)制數(shù)站玄,八個(gè)比特組成一個(gè)字節(jié)。那么我們?nèi)绾螌⑷粘V惺褂玫奈淖峙c符號(hào)轉(zhuǎn)換為計(jì)算機(jī)能夠識(shí)別的二進(jìn)制數(shù)呢濒旦,這就用到了字符編碼株旷。
字符編碼的定義
字符編碼,首先看維基百科中的定義:
字符編碼(英語(yǔ):Character encoding)尔邓、字集碼:是把字符集中的字符編碼為指定集合中某一對(duì)象(例如:比特模式晾剖、自然數(shù)序列、8位組或者電脈沖)梯嗽,以便文本在計(jì)算機(jī)中存儲(chǔ)和通過通信網(wǎng)絡(luò)的傳遞齿尽。
簡(jiǎn)單來說,在計(jì)算機(jī)科學(xué)中灯节,字符編碼就是一種編碼規(guī)則循头,可以將字符集(某種包含了各種字符與文字的集合)中的字符轉(zhuǎn)換為計(jì)算機(jī)能夠識(shí)別的二進(jìn)制代碼。
常見的字符編碼介紹
目前被我們大眾所熟知的字符編碼有以下幾種:
ASCII碼
ASCII炎疆,全稱:American Standard Code for Information Interchange(美國(guó)信息交換標(biāo)準(zhǔn)代碼)卡骂,是基于拉丁字母的一套編碼系統(tǒng),由電報(bào)代碼發(fā)展而來磷雇,主要用于顯示現(xiàn)代英語(yǔ)。ASCII碼標(biāo)準(zhǔn)由美國(guó)國(guó)家標(biāo)準(zhǔn)學(xué)會(huì)制定躏救,最近一次更新于1986年唯笙。目前,ASCII碼共規(guī)定了128個(gè)字符的編碼盒使,占用了一個(gè)字節(jié)的后七位崩掘,第一位統(tǒng)一規(guī)定為0。其中包含了英文的大小寫字母少办、數(shù)字苞慢、標(biāo)點(diǎn)符號(hào)等常用的字符。
e.g. 大寫字母A在ASCII碼中對(duì)應(yīng)65英妓,二進(jìn)制碼為:01000001挽放。**ISO 8859 **
ASCII碼的誕生绍赛,幫助美國(guó)人解決了字符在計(jì)算機(jī)中的存儲(chǔ)問題,但其他一些不使用英文的國(guó)家辑畦,就無法使用ASCII碼吗蚌。為此,各國(guó)專家紛紛借鑒ASCII的設(shè)計(jì)理念纯出,編制了許多用 8 位二進(jìn)制數(shù)來表示字符的擴(kuò)充字符集蚯妇。為了統(tǒng)一各國(guó)各語(yǔ)言的單獨(dú)編碼的混亂局面,國(guó)際標(biāo)準(zhǔn)化組織(ISO)及國(guó)際電工委員會(huì)(IEC)聯(lián)合制定了一系列8位元字符集的標(biāo)準(zhǔn)暂筝,ISO 8859(全稱ISO/IEC 8859)箩言。ISO 8859的前七位完全兼容 ASCII,編號(hào)128 – 159 共32個(gè)編碼保留給擴(kuò)充定義的 32 個(gè)擴(kuò)充控制碼焕襟,160 為不換行空格陨收,161 - 255的95個(gè)數(shù)字用于新增加的字符代碼。目前胧洒,ISO 8859共定義了15個(gè)字符集畏吓。**GB 2312/GBK/GB 18030 **
ISO8859解決了大多數(shù)的西方國(guó)家的編碼問題,接下來還需要解決中國(guó)的編碼問題卫漫。1980年菲饼,中國(guó)國(guó)家標(biāo)準(zhǔn)總局發(fā)布了GB 2312(或 GB 2312–80,全稱:中華人民共和國(guó)國(guó)家標(biāo)準(zhǔn)簡(jiǎn)體中文字符集)列赎,并于1981年5月1日正式實(shí)施宏悦。GB 2312中,每個(gè)漢字及符號(hào)以兩個(gè)字節(jié)來表示包吝。第一個(gè)字節(jié)稱為“高位字節(jié)”饼煞,第二個(gè)字節(jié)稱為“低位字節(jié)”。GB 2312標(biāo)準(zhǔn)共收錄6763個(gè)漢字诗越,其中一級(jí)漢字3755個(gè)砖瞧,二級(jí)漢字3008個(gè);同時(shí)收錄了包括拉丁字母嚷狞、希臘字母块促、日文平假名及片假名字母、俄語(yǔ)西里爾字母在內(nèi)的682個(gè)字符床未。
GB 2312的出現(xiàn)基本滿足了漢字的計(jì)算機(jī)處理需求竭翠,但是對(duì)于一些生僻字、在GB 2312標(biāo)準(zhǔn)發(fā)布后才推出的簡(jiǎn)化字薇搁、臺(tái)灣及香港使用的繁體字斋扰,日語(yǔ)及朝鮮語(yǔ)漢字等,GB 2312未收錄其中。于是微軟利用了GB 2312-80未使用的編碼空間传货,收錄了GB 13000.1-93的全部字符屎鳍,制定了GBK編碼,GBK編碼向下兼容GB 2312损离。
2000年3月17日哥艇,中華人民共和國(guó)國(guó)家質(zhì)量技術(shù)監(jiān)督局又推出了GB 18030-2000標(biāo)準(zhǔn),以取代GBK僻澎,但是將GBK作為子集完全保留∶蔡ぃ現(xiàn)行GB 18030版本由國(guó)家質(zhì)量監(jiān)督檢驗(yàn)總局和中國(guó)國(guó)家標(biāo)準(zhǔn)化管理委員會(huì)于2005年11月8日發(fā)布,2006年5月1日正式實(shí)施窟勃,全稱:國(guó)家標(biāo)準(zhǔn)GB 18030-2005《信息技術(shù) 中文編碼字符集》祖乳,共收錄漢字70,244個(gè)。**Unicode **
上述的各種編碼系統(tǒng)秉氧,在各個(gè)國(guó)家內(nèi)部都得到了廣泛的運(yùn)用眷昆,但是在不同的國(guó)家之間使用時(shí)就容易出現(xiàn)不兼容的情況。這就需要一個(gè)統(tǒng)一的編碼系統(tǒng)來解決這個(gè)兼容問題汁咏,于是就出現(xiàn)了Unicode(統(tǒng)一碼)亚斋。
Unicode編碼系統(tǒng)可分為編碼方式和實(shí)現(xiàn)方式兩個(gè)層次。Unicode碼的編碼方式與ISO制定的ISO 10646標(biāo)準(zhǔn)所定義的通用字符集(UCS)概念相對(duì)應(yīng)攘滩,UCS包含了已知語(yǔ)言的所有字符帅刊。Unicode的實(shí)現(xiàn)方式不同于編碼方式。一個(gè)字符的Unicode編碼是確定的漂问。但出于對(duì)于不同系統(tǒng)平臺(tái)設(shè)計(jì)的適用需求及節(jié)省空間的需求赖瞒,Unicode編碼存在多種實(shí)現(xiàn)方式,這些實(shí)現(xiàn)方式稱為Unicode轉(zhuǎn)換格式(Unicode Transformation Format蚤假,簡(jiǎn)稱為UTF)栏饮。
目前,UTF-8是在互聯(lián)網(wǎng)上使用最為廣泛的一種Unicode實(shí)現(xiàn)方式磷仰,其他還有UTF-16袍嬉、UTF-32。UTF-8最大的特點(diǎn)是灶平,它是一種變長(zhǎng)的編碼方式伺通,可以用1~4個(gè)字節(jié)表示一個(gè)符號(hào)。
UTF的編碼規(guī)則民逼,大致可概括如下:
Unicode范圍(十六進(jìn)制) | UTF編碼 (二進(jìn)制) |
---|---|
0000 0000 - 0000 007F | 0xxxxxxx |
0000 0080 - 0000 07FF | 110xxxxx 10xxxxxx |
0000 0800 - 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
0001 0000 - 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
- 對(duì)于單字節(jié)的符號(hào)泵殴,UTF編碼的第一位為0涮帘,后七位與Unicode編碼一致拼苍,與ASCII碼兼容。
- 對(duì)于多字節(jié)的符號(hào),假設(shè)有n個(gè)字節(jié)疮鲫,則第一個(gè)字節(jié)的前n位均為1吆你,第n+1位為0,后n-1個(gè)字節(jié)的前兩位均為10俊犯,其余的xxx均為Unicode碼妇多。