佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > 字符集和字符編碼(Charset & Encoding)

字符集和字符編碼(Charset & Encoding)

熱門標(biāo)簽:網(wǎng)站文章發(fā)布 鐵路電話系統(tǒng) 銀行業(yè)務(wù) 智能手機(jī) 呼叫中心市場需求 檢查注冊表項(xiàng) 服務(wù)器配置 美圖手機(jī)

相信大家一定碰到過,打開某個網(wǎng)頁,卻顯示一堆像亂碼,如"бЇЯАзЪСЯ"、"????????"?還記得HTTP中的Accept-Charset、Accept-Encoding、Accept-Language、Content-Encoding、Content-Language等消息頭字段?這些就是接下來我們要探討的。

目錄:

    1.基礎(chǔ)知識
    2.常用字符集和字符編碼
    2.1. ASCII字符集編碼2.2. GBXXXX字符集編碼2.3. BIG5字符集編碼
    3.偉大的創(chuàng)想Unicode
    3.1.UCS UNICODE3.2.UTF-323.3.UTF-163.4.UTF-84.Accept-Charset/Accept-Encoding/Accept-Language/Content-Type/Content-Encoding/Content-Language參考文獻(xiàn)進(jìn)一步閱讀

     

    1.基礎(chǔ)知識

    計(jì)算機(jī)中儲存的信息都是用二進(jìn)制數(shù)表示的;而我們在屏幕上看到的英文、漢字等字符是二進(jìn)制數(shù)轉(zhuǎn)換之后的結(jié)果。通俗的說,按照何種規(guī)則將字符存儲在計(jì)算機(jī)中,如'a'用什么表示,稱為"編碼";反之,將存儲在計(jì)算機(jī)中的二進(jìn)制數(shù)解析顯示出來,稱為"解碼",如同密碼學(xué)中的加密和解密。在解碼過程中,如果使用了錯誤的解碼規(guī)則,則導(dǎo)致'a'解析成'b'或者亂碼。

    字符集(Charset):是一個系統(tǒng)支持的所有抽象字符的集合。字符是各種文字和符號的總稱,包括各國家文字、標(biāo)點(diǎn)符號、圖形符號、數(shù)字等。

    字符編碼(Character Encoding):是一套法則,使用該法則能夠?qū)ψ匀徽Z言的字符的一個集合(如字母表或音節(jié)表),與其他東西的一個集合(如號碼或電脈沖)進(jìn)行配對。即在符號集合與數(shù)字系統(tǒng)之間建立對應(yīng)關(guān)系,它是信息處理的一項(xiàng)基本技術(shù)。通常人們用符號集合(一般情況下就是文字)來表達(dá)信息。而以計(jì)算機(jī)為基礎(chǔ)的信息處理系統(tǒng)則是利用元件(硬件)不同狀態(tài)的組合來存儲和處理信息的。元件不同狀態(tài)的組合能代表數(shù)字系統(tǒng)的數(shù)字,因此字符編碼就是將符號轉(zhuǎn)換為計(jì)算機(jī)可以接受的數(shù)字系統(tǒng)的數(shù),稱為數(shù)字代碼。

     

    2.常用字符集和字符編碼

    常見字符集名稱:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。計(jì)算機(jī)要準(zhǔn)確的處理各種字符集文字,需要進(jìn)行字符編碼,以便計(jì)算機(jī)能夠識別和存儲各種文字。

     

    2.1. ASCII字符集編碼

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

    ASCII字符集:主要包括控制字符(回車鍵、退格、換行鍵等);可顯示字符(英文大小寫字符、阿拉伯?dāng)?shù)字和西文符號)。

    ASCII編碼:將ASCII字符集轉(zhuǎn)換為計(jì)算機(jī)可以接受的數(shù)字系統(tǒng)的數(shù)的規(guī)則。使用7位(bits)表示一個字符,共128字符;但是7位編碼的字符集只能支持128個字符,為了表示更多的歐洲常用字符對ASCII進(jìn)行了擴(kuò)展,ASCII擴(kuò)展字符集使用8位(bits)表示一個字符,共256字符。ASCII字符集映射到數(shù)字編碼規(guī)則如下圖所示:

    圖1 ASCII編碼表

    圖2 擴(kuò)展ASCII編碼表

    ASCII的最大缺點(diǎn)是只能顯示26個基本拉丁字母、阿拉伯?dāng)?shù)目字和英式標(biāo)點(diǎn)符號,因此只能用于顯示現(xiàn)代美國英語(而且在處理英語當(dāng)中的外來詞如naïve、café、élite等等時,所有重音符號都不得不去掉,即使這樣做會違反拼寫規(guī)則)。而EASCII雖然解決了部份西歐語言的顯示問題,但對更多其他語言依然無能為力。因此現(xiàn)在的蘋果電腦已經(jīng)拋棄ASCII而轉(zhuǎn)用Unicode。

     

    2.2. GBXXXX字符集編碼

    計(jì)算機(jī)發(fā)明之處及后面很長一段時間,只用應(yīng)用于美國及西方一些發(fā)達(dá)國家,ASCII能夠很好滿足用戶的需求。但是當(dāng)天朝也有了計(jì)算機(jī)之后,為了顯示中文,必須設(shè)計(jì)一套編碼規(guī)則用于將漢字轉(zhuǎn)換為計(jì)算機(jī)可以接受的數(shù)字系統(tǒng)的數(shù)。

    天朝專家把那些127號之后的奇異符號們(即EASCII)取消掉,規(guī)定:一個小于127的字符的意義與原來相同,但兩個大于127的字符連在一起時,就表示一個漢字,前面的一個字節(jié)(他稱之為高字節(jié))從0xA1用到 0xF7,后面一個字節(jié)(低字節(jié))從0xA1到0xFE,這樣我們就可以組合出大約7000多個簡體漢字了。在這些編碼里,還把數(shù)學(xué)符號、羅馬希臘的 字母、日文的假名們都編進(jìn)去了,連在ASCII里本來就有的數(shù)字、標(biāo)點(diǎn)、字母都統(tǒng)統(tǒng)重新編了兩個字節(jié)長的編碼,這就是常說的"全角"字符,而原來在127號以下的那些就叫"半角"字符了。

    上述編碼規(guī)則就是GB2312。GB2312GB2312-80是中國國家標(biāo)準(zhǔn)簡體中文字符集,全稱《信息交換用漢字編碼字符集·基本集》,又稱GB0,由中國國家標(biāo)準(zhǔn)總局發(fā)布,1981年5月1日實(shí)施。GB2312編碼通行于中國大陸;新加坡等地也采用此編碼。中國大陸幾乎所有的中文系統(tǒng)和國際化的軟件都支持GB2312。GB2312的出現(xiàn),基本滿足了漢字的計(jì)算機(jī)處理需要,它所收錄的漢字已經(jīng)覆蓋中國大陸99.75%的使用頻率。對于人名、古漢語等方面出現(xiàn)的罕用字,GB2312不能處理,這導(dǎo)致了后來GBK及GB 18030漢字字符集的出現(xiàn)。下圖是GB2312編碼的開始部分(由于其非常龐大,只列舉開始部分,具體可查看GB2312簡體中文編碼表):

    圖3 GB2312編碼表的開始部分

    由于GB 2312-80只收錄6763個漢字,有不少漢字,如部分在GB 2312-80推出以后才簡化的漢字(如"啰"),部分人名用字(如中國前總理朱镕基的"镕"字),臺灣及香港使用的繁體字,日語及朝鮮語漢字等,并未有收錄在內(nèi)。于是廠商微軟利用GB 2312-80未使用的編碼空間,收錄GB 13000.1-93全部字符制定了GBK編碼。根據(jù)微軟資料,GBK是對GB2312-80的擴(kuò)展,也就是CP936字碼表 (Code Page 936)的擴(kuò)展(之前CP936和GB 2312-80一模一樣),最早實(shí)現(xiàn)于Windows 95簡體中文版。雖然GBK收錄GB 13000.1-93的全部字符,但編碼方式并不相同。GBK自身并非國家標(biāo)準(zhǔn),只是曾由國家技術(shù)監(jiān)督局標(biāo)準(zhǔn)化司、電子工業(yè)部科技與質(zhì)量監(jiān)督司公布為"技術(shù)規(guī)范指導(dǎo)性文件"。原始GB13000一直未被業(yè)界采用,后續(xù)國家標(biāo)準(zhǔn)GB18030技術(shù)上兼容GBK而非GB13000。

    GB 18030,全稱:國家標(biāo)準(zhǔn)GB 18030-2005《信息技術(shù) 中文編碼字符集》,是中華人民共和國現(xiàn)時最新的內(nèi)碼字集,是GB 18030-2000《信息技術(shù) 信息交換用漢字編碼字符集 基本集的擴(kuò)充》的修訂版。與GB 2312-1980完全兼容,與GBK基本兼容,支持GB 13000及Unicode的全部統(tǒng)一漢字,共收錄漢字70244個。GB 18030主要有以下特點(diǎn):

    與UTF-8相同,采用多字節(jié)編碼,每個字可以由1個、2個或4個字節(jié)組成。編碼空間龐大,最多可定義161萬個字符。支持中國國內(nèi)少數(shù)民族的文字,不需要動用造字區(qū)。
    漢字收錄范圍包含繁體漢字以及日韓漢字

    圖4 GB18030編碼總體結(jié)構(gòu)

    本規(guī)格的初版使中華人民共和國信息產(chǎn)業(yè)部電子工業(yè)標(biāo)準(zhǔn)化研究所起草,由國家質(zhì)量技術(shù)監(jiān)督局于2000年3月17日發(fā)布?,F(xiàn)行版本為國家質(zhì)量監(jiān)督檢驗(yàn)總局和中國國家標(biāo)準(zhǔn)化管理委員會于2005年11月8日發(fā)布,2006年5月1日實(shí)施。此規(guī)格為在中國境內(nèi)所有軟件產(chǎn)品支持的強(qiáng)制規(guī)格。

     

    2.3. BIG5字符集編碼

    Big5,又稱為大五碼五大碼,是使用繁體中文(正體中文)社區(qū)中最常用的電腦漢字字符集標(biāo)準(zhǔn),共收錄13,060個漢字。中文碼分為內(nèi)碼及交換碼兩類,Big5屬中文內(nèi)碼,知名的中文交換碼有CCCII、CNS11643。Big5雖普及于臺灣、香港與澳門等繁體中文通行區(qū),但長期以來并非當(dāng)?shù)氐膰覙?biāo)準(zhǔn),而只是業(yè)界標(biāo)準(zhǔn)。倚天中文系統(tǒng)、Windows等主要系統(tǒng)的字符集都是以Big5為基準(zhǔn),但廠商又各自增加不同的造字與造字區(qū),派生成多種不同版本。2003年,Big5被收錄到CNS11643中文標(biāo)準(zhǔn)交換碼的附錄當(dāng)中,取得了較正式的地位。這個最新版本被稱為Big5-2003。

    Big5碼是一套雙字節(jié)字符集,使用了雙八碼存儲方法,以兩個字節(jié)來安放一個字。第一個字節(jié)稱為"高位字節(jié)",第二個字節(jié)稱為"低位字節(jié)"。"高位字節(jié)"使用了0x81-0xFE,"低位字節(jié)"使用了0x40-0x7E,及0xA1-0xFE。Big5的分區(qū)中:

0x8140-0xA0FE

保留給用戶自定義字符(造字區(qū))

0xA140-0xA3BF

標(biāo)點(diǎn)符號、希臘字母及特殊符號,包括在0xA259-0xA261,安放了九個計(jì)量用漢字:兙兛兞兝兡兣嗧瓩糎。

0xA3C0-0xA3FE

保留。此區(qū)沒有開放作造字區(qū)用。

0xA440-0xC67E

常用漢字,先按筆劃再按部首排序。

0xC6A1-0xC8FE

保留給用戶自定義字符(造字區(qū))

0xC940-0xF9D5

次常用漢字,亦是先按筆劃再按部首排序。

0xF9D6-0xFEFE

保留給用戶自定義字符(造字區(qū))

Unicode字符集UTF編碼

 

3.偉大的創(chuàng)想Unicode

——不得不單獨(dú)說Unicode

像天朝一樣,當(dāng)計(jì)算機(jī)傳到世界各個國家時,為了適合當(dāng)?shù)卣Z言和字符,設(shè)計(jì)和實(shí)現(xiàn)類似GB232/GBK/GB18030/BIG5的編碼方案。這樣各搞一套,在本地使用沒有問題,一旦出現(xiàn)在網(wǎng)絡(luò)中,由于不兼容,互相訪問就出現(xiàn)了亂碼現(xiàn)象。

為了解決這個問題,一個偉大的創(chuàng)想產(chǎn)生了——Unicode。Unicode編碼系統(tǒng)為表達(dá)任意語言的任意字符而設(shè)計(jì)。它使用4字節(jié)的數(shù)字來表達(dá)每個字母、符號,或者表意文字(ideograph)。每個數(shù)字代表唯一的至少在某種語言中使用的符號。(并不是所有的數(shù)字都用上了,但是總數(shù)已經(jīng)超過了65535,所以2個字節(jié)的數(shù)字是不夠用的。)被幾種語言共用的字符通常使用相同的數(shù)字來編碼,除非存在一個在理的語源學(xué)(etymological)理由使不這樣做。不考慮這種情況的話,每個字符對應(yīng)一個數(shù)字,每個數(shù)字對應(yīng)一個字符。即不存在二義性。不再需要記錄"模式"了。U+0041總是代表'A',即使這種語言沒有'A'這個字符。

在計(jì)算機(jī)科學(xué)領(lǐng)域中,Unicode統(tǒng)一碼萬國碼、單一碼標(biāo)準(zhǔn)萬國碼)是業(yè)界的一種標(biāo)準(zhǔn),它可以使電腦得以體現(xiàn)世界上數(shù)十種文字的系統(tǒng)。Unicode 是基于通用字符集(Universal Character Set)的標(biāo)準(zhǔn)來發(fā)展,并且同時也以書本的形式[1]對外發(fā)表。Unicode 還不斷在擴(kuò)增, 每個新版本插入更多新的字符。直至目前為止的第六版,Unicode 就已經(jīng)包含了超過十萬個字符(在2005年,Unicode 的第十萬個字符被采納且認(rèn)可成為標(biāo)準(zhǔn)之一)、一組可用以作為視覺參考的代碼圖表、一套編碼方法與一組標(biāo)準(zhǔn)字符編碼、一套包含了上標(biāo)字、下標(biāo)字等字符特性的枚舉等。Unicode 組織(The Unicode Consortium)是由一個非營利性的機(jī)構(gòu)所運(yùn)作,并主導(dǎo) Unicode 的后續(xù)發(fā)展,其目標(biāo)在于:將既有的字符編碼方案以Unicode 編碼方案來加以取代,特別是既有的方案在多語環(huán)境下,皆僅有有限的空間以及不兼容的問題。

可以這樣理解:Unicode是字符集,UTF-32/ UTF-16/ UTF-8是三種字符編碼方案。

 

3.1.UCS UNICODE

通用字符集(Universal Character Set,UCS)是由ISO制定的ISO 10646(或稱ISO/IEC 10646)標(biāo)準(zhǔn)所定義的標(biāo)準(zhǔn)字符集。歷史上存在兩個獨(dú)立的嘗試創(chuàng)立單一字符集的組織,即國際標(biāo)準(zhǔn)化組織(ISO)和多語言軟件制造商組成的統(tǒng)一碼聯(lián)盟。前者開發(fā)的 ISO/IEC 10646 項(xiàng)目,后者開發(fā)的統(tǒng)一碼項(xiàng)目。因此最初制定了不同的標(biāo)準(zhǔn)。

1991年前后,兩個項(xiàng)目的參與者都認(rèn)識到,世界不需要兩個不兼容的字符集。于是,它們開始合并雙方的工作成果,并為創(chuàng)立一個單一編碼表而協(xié)同工作。從Unicode 2.0開始,Unicode采用了與ISO 10646-1相同的字庫和字碼;ISO也承諾,ISO 10646將不會替超出U+10FFFF的UCS-4編碼賦值,以使得兩者保持一致。兩個項(xiàng)目仍都存在,并獨(dú)立地公布各自的標(biāo)準(zhǔn)。但統(tǒng)一碼聯(lián)盟和ISO/IEC JTC1/SC2都同意保持兩者標(biāo)準(zhǔn)的碼表兼容,并緊密地共同調(diào)整任何未來的擴(kuò)展。在發(fā)布的時候,Unicode一般都會采用有關(guān)字碼最常見的字型,但I(xiàn)SO 10646一般都盡可能采用Century字型。

 

3.2.UTF-32

上述使用4字節(jié)的數(shù)字來表達(dá)每個字母、符號,或者表意文字(ideograph),每個數(shù)字代表唯一的至少在某種語言中使用的符號的編碼方案,稱為UTF-32。UTF-32又稱UCS-4是一種將Unicode字符編碼的協(xié)定,對每個字符都使用4字節(jié)。就空間而言,是非常沒有效率的。

這種方法有其優(yōu)點(diǎn),最重要的一點(diǎn)就是可以在常數(shù)時間內(nèi)定位字符串里的第N個字符,因?yàn)榈贜個字符從第4×Nth個字節(jié)開始。雖然每一個碼位使用固定長定的字節(jié)看似方便,它并不如其它Unicode編碼使用得廣泛。

 

3.3.UTF-16

盡管有Unicode字符非常多,但是實(shí)際上大多數(shù)人不會用到超過前65535個以外的字符。因此,就有了另外一種Unicode編碼方式,叫做UTF-16(因?yàn)?6位 = 2字節(jié))。UTF-16將0–65535范圍內(nèi)的字符編碼成2個字節(jié),如果真的需要表達(dá)那些很少使用的"星芒層(astral plane)"內(nèi)超過這65535范圍的Unicode字符,則需要使用一些詭異的技巧來實(shí)現(xiàn)。UTF-16編碼最明顯的優(yōu)點(diǎn)是它在空間效率上比UTF-32高兩倍,因?yàn)槊總€字符只需要2個字節(jié)來存儲(除去65535范圍以外的),而不是UTF-32中的4個字節(jié)。并且,如果我們假設(shè)某個字符串不包含任何星芒層中的字符,那么我們依然可以在常數(shù)時間內(nèi)找到其中的第N個字符,直到它不成立為止這總是一個不錯的推斷。其編碼方法是:

如果字符編碼U小于0x10000,也就是十進(jìn)制的0到65535之內(nèi),則直接使用兩字節(jié)表示;
如果字符編碼U大于0x10000,由于UNICODE編碼范圍最大為0x10FFFF,從0x10000到0x10FFFF之間 共有0xFFFFF個編碼,也就是需要20個bit就可以標(biāo)示這些編碼。用U'表示從0-0xFFFFF之間的值,將其前 10 bit作為高位和16 bit的數(shù)值0xD800進(jìn)行 邏輯or 操作,將后10 bit作為低位和0xDC00做 邏輯or 操作,這樣組成的 4個byte就構(gòu)成了U的編碼。

對于UTF-32和UTF-16編碼方式還有一些其他不明顯的缺點(diǎn)。不同的計(jì)算機(jī)系統(tǒng)會以不同的順序保存字節(jié)。這意味著字符U+4E2D在UTF-16編碼方式下可能被保存為4E 2D或者2D 4E,這取決于該系統(tǒng)使用的是大尾端(big-endian)還是小尾端(little-endian)。(對于UTF-32編碼方式,則有更多種可能的字節(jié)排列。)只要文檔沒有離開你的計(jì)算機(jī),它還是安全的——同一臺電腦上的不同程序使用相同的字節(jié)順序(byte order)。但是當(dāng)我們需要在系統(tǒng)之間傳輸這個文檔的時候,也許在萬維網(wǎng)中,我們就需要一種方法來指示當(dāng)前我們的字節(jié)是怎樣存儲的。不然的話,接收文檔的計(jì)算機(jī)就無法知道這兩個字節(jié)4E 2D表達(dá)的到底是U+4E2D還是U+2D4E。

為了解決這個問題,多字節(jié)的Unicode編碼方式定義了一個"字節(jié)順序標(biāo)記(Byte Order Mark)",它是一個特殊的非打印字符,你可以把它包含在文檔的開頭來指示你所使用的字節(jié)順序。對于UTF-16,字節(jié)順序標(biāo)記是U+FEFF。如果收到一個以字節(jié)FF FE開頭的UTF-16編碼的文檔,你就能確定它的字節(jié)順序是單向的(one way)的了;如果它以FE FF開頭,則可以確定字節(jié)順序反向了。

 

3.4.UTF-8

UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼(定長碼),也是一種前綴碼。它可以用來表示Unicode標(biāo)準(zhǔn)中的任何字符,且其編碼中的第一個字節(jié)仍與ASCII兼容,這使得原來處理ASCII字符的軟件無須或只須做少部份修改,即可繼續(xù)使用。因此,它逐漸成為電子郵件、網(wǎng)頁及其他存儲或傳送文字的應(yīng)用中,優(yōu)先采用的編碼?;ヂ?lián)網(wǎng)工程工作小組(IETF)要求所有互聯(lián)網(wǎng)協(xié)議都必須支持UTF-8編碼。

UTF-8使用一至四個字節(jié)為每個字符編碼:

    128個US-ASCII字符只需一個字節(jié)編碼(Unicode范圍由U+0000至U+007F)。帶有附加符號的拉丁文、希臘文、西里爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文及它拿字母則需要二個字節(jié)編碼(Unicode范圍由U+0080至U+07FF)。其他基本多文種平面(BMP)中的字符(這包含了大部分常用字)使用三個字節(jié)編碼。
    其他極少使用的Unicode輔助平面的字符使用四字節(jié)編碼。

    在處理經(jīng)常會用到的ASCII字符方面非常有效。在處理擴(kuò)展的拉丁字符集方面也不比UTF-16差。對于中文字符來說,比UTF-32要好。同時,(在這一條上你得相信我,因?yàn)槲也淮蛩憬o你展示它的數(shù)學(xué)原理。)由位操作的天性使然,使用UTF-8不再存在字節(jié)順序的問題了。一份以utf-8編碼的文檔在不同的計(jì)算機(jī)之間是一樣的比特流。

    總體來說,在Unicode字符串中不可能由碼點(diǎn)數(shù)量決定顯示它所需要的長度,或者顯示字符串之后在文本緩沖區(qū)中光標(biāo)應(yīng)該放置的位置;組合字符、變寬字體、不可打印字符和從右至左的文字都是其歸因。所以盡管在UTF-8字符串中字符數(shù)量與碼點(diǎn)數(shù)量的關(guān)系比UTF-32更為復(fù)雜,在實(shí)際中很少會遇到有不同的情形。

    優(yōu)點(diǎn)

UTF-8是ASCII的一個超集。因?yàn)橐粋€純ASCII字符串也是一個合法的UTF-8字符串,所以現(xiàn)存的ASCII文本不需要轉(zhuǎn)換。為傳統(tǒng)的擴(kuò)展ASCII字符集設(shè)計(jì)的軟件通??梢圆唤?jīng)修改或很少修改就能與UTF-8一起使用。使用標(biāo)準(zhǔn)的面向字節(jié)的排序例程對UTF-8排序?qū)a(chǎn)生與基于Unicode代碼點(diǎn)排序相同的結(jié)果。(盡管這只有有限的有用性,因?yàn)樵谌魏翁囟ㄕZ言或文化下都不太可能有仍可接受的文字排列順序。)UTF-8和UTF-16都是可擴(kuò)展標(biāo)記語言文檔的標(biāo)準(zhǔn)編碼。所有其它編碼都必須通過顯式或文本聲明來指定。任何面向字節(jié)的字符串搜索算法都可以用于UTF-8的數(shù)據(jù)(只要輸入僅由完整的UTF-8字符組成)。但是,對于包含字符記數(shù)的正則表達(dá)式或其它結(jié)構(gòu)必須小心。
UTF-8字符串可以由一個簡單的算法可靠地識別出來。就是,一個字符串在任何其它編碼中表現(xiàn)為合法的UTF-8的可能性很低,并隨字符串長度增長而減小。舉例說,字符值C0,C1,F5至FF從來沒有出現(xiàn)。為了更好的可靠性,可以使用正則表達(dá)式來統(tǒng)計(jì)非法過長和替代值(可以查看W3 FAQ: Multilingual Forms上的驗(yàn)證UTF-8字符串的正則表達(dá)式)。

缺點(diǎn)

因?yàn)槊總€字符使用不同數(shù)量的字節(jié)編碼,所以尋找串中第N個字符是一個O(N)復(fù)雜度的操作 — 即,串越長,則需要更多的時間來定位特定的字符。同時,還需要位變換來把字符編碼成字節(jié),把字節(jié)解碼成字符。

 

4.Accept-Charset/Accept-Encoding/Accept-Language/Content-Type/Content-Encoding/Content-Language

在HTTP中,與字符集和字符編碼相關(guān)的消息頭是Accept-Charset/Content-Type,另外主區(qū)區(qū)分Accept-Charset/Accept-Encoding/Accept-Language/Content-Type/Content-Encoding/Content-Language:

Accept-Charset:瀏覽器申明自己接收的字符集,這就是本文前面介紹的各種字符集和字符編碼,如gb2312,utf-8(通常我們說Charset包括了相應(yīng)的字符編碼方案);

Accept-Encoding:瀏覽器申明自己接收的編碼方法,通常指定壓縮方法,是否支持壓縮,支持什么壓縮方法(gzip,deflate),(注意:這不是只字符編碼);

Accept-Language:瀏覽器申明自己接收的語言。語言跟字符集的區(qū)別:中文是語言,中文有多種字符集,比如big5,gb2312,gbk等等;

Content-Type:WEB服務(wù)器告訴瀏覽器自己響應(yīng)的對象的類型和字符集。例如:Content-Type: text/html; charset='gb2312'

Content-Encoding:WEB服務(wù)器表明自己使用了什么壓縮方法(gzip,deflate)壓縮響應(yīng)中的對象。例如:Content-Encoding:gzip

Content-Language:WEB服務(wù)器告訴瀏覽器自己響應(yīng)的對象的語言。

 

參考文獻(xiàn)進(jìn)一步閱讀
    百度百科. 字符集. http://baike.baidu.com/view/51987.htm, 2010-12-28維基百科. 字符編碼. http://zh.wikipedia.org/wiki/%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81, 2011-1-5維基百科. ASCII. http://zh.wikipedia.org/wiki/ASCII, 2011-4-5維基百科. GB2312. http://zh.wikipedia.org/wiki/GB_2312, 2011-3-17維基百科. GB18030. http://zh.wikipedia.org/wiki/GB_18030, 2010-3-10維基百科. GBK. http://zh.wikipedia.org/wiki/GBK, 2011-3-7維基百科. Unicode. http://zh.wikipedia.org/wiki/Unicode, 2011-4-30Laruence. 字符編碼詳解(基礎(chǔ)). http://www.laruence.com/2009/08/22/1059.html, 2009-8-22Jan Hunt. Character Sets and Encoding for Web Designers - UCS/UNICODE. http://www.uninetnews.com/other_standards/charset.php


作者:吳秦
出處:http://www.cnblogs.com/skynet/
本文基于署名 2.5 中國大陸許可協(xié)議發(fā)布,歡迎轉(zhuǎn)載,演繹或用于商業(yè)目的,但是必須保留本文的署名吳秦(包含鏈接).

您可能感興趣的文章:
  • 字符編碼詳解及由來(UNICODE,UTF-8,GBK) 比較詳細(xì)
  • 編碼史記

標(biāo)簽:新疆 上海 樂山 紅河 河南 沈陽 長治 滄州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《字符集和字符編碼(Charset & Encoding)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    黔东| 阜城县| 惠水县| 尤溪县| 板桥市| 高平市| 麦盖提县| 西林县| 嘉义县| 定日县| 信丰县| 华坪县| 罗江县| 鹿邑县| 洛扎县| 昌江| 宁波市| 宜黄县| 广宁县| 河池市| 嘉黎县| 黄大仙区| 大安市| 高雄县| 伽师县| 菏泽市| 阜宁县| 宝坻区| 民乐县| 遵义市| 吉首市| 台安县| 宁河县| 盐津县| 达拉特旗| 赤峰市| 九寨沟县| 广东省| 佛学| 柏乡县| 台州市|