<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                原文:[字符集和字符編碼(Charset & Encoding)](http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html) 原作者:[吳秦(Tyler)](http://www.cnblogs.com/skynet/) *——每個軟件開發人員應該無條件掌握的知識!* *——Unicode偉大的創想!* 相信大家一定碰到過,打開某個網頁,卻顯示一堆像亂碼,如"б?ЯАзЪСЯ"、"?????????"?還記得HTTP中的Accept-Charset、Accept-Encoding、Accept-Language、Content-Encoding、Content-Language等消息頭字段?這些就是接下來我們要探討的。 目錄: * [1.基礎知識](http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html#_1.基礎知識) * [2.常用字符集和字符編碼](http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html#_2.常用字符集和字符編碼) * [2.1\. ASCII字符集&編碼](http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html#_2.1._ASCII字符集&ASCII編碼) * [2.2\. GBXXXX字符集&編碼](http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html#_2.2._GBXXXX字符集&編碼) * [2.3\. BIG5字符集&編碼](http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html#_2.3._BIG5字符集&編碼) * [3.偉大的創想Unicode](http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html#_3.偉大的創想Unicode) * [3.1.UCS & UNICODE](http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html#_3.1.UCS_&_UNICODE) * [3.2.UTF-32](http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html#_3.2.UTF-32) * [3.3.UTF-16](http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html#_3.3.UTF-16) * [3.4.UTF-8](http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html#_3.4.UTF-8) * [4.Accept-Charset/Accept-Encoding/Accept-Language/Content-Type/Content-Encoding/Content-Language](http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html#_4.Accept-Charset/Accept-Encoding/Ac) * [參考文獻&進一步閱讀](http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html#_參考文獻&進一步閱讀) # 1.基礎知識 計算機中儲存的信息都是用二進制數表示的;而我們在屏幕上看到的英文、漢字等字符是二進制數轉換之后的結果。通俗的說,按照何種規則將字符存儲在計算機中,如'a'用什么表示,稱為"編碼";反之,將存儲在計算機中的二進制數解析顯示出來,稱為"解碼",如同密碼學中的加密和解密。在解碼過程中,如果使用了錯誤的解碼規則,則導致'a'解析成'b'或者亂碼。 **字符集(Charset)**:是一個系統支持的所有抽象字符的集合。字符是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。 **字符編碼(Character Encoding)**:是一套法則,使用該法則能夠對自然語言的字符的一個集合(如字母表或音節表),與其他東西的一個集合(如號碼或電脈沖)進行配對。即在符號集合與數字系統之間建立對應關系,它是信息處理的一項基本技術。通常人們用符號集合(一般情況下就是文字)來表達信息。而以計算機為基礎的信息處理系統則是利用元件(硬件)不同狀態的組合來存儲和處理信息的。元件不同狀態的組合能代表數字系統的數字,因此字符編碼就是將符號轉換為計算機可以接受的數字系統的數,稱為數字代碼。 # 2.常用字符集和字符編碼 常見字符集名稱:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。計算機要準確的處理各種字符集文字,需要進行字符編碼,以便計算機能夠識別和存儲各種文字。 ## 2.1\. ASCII字符集&編碼 **ASCII**(**A**merican?**S**tandard?**C**ode for?**I**nformation?**I**nterchange,**美國信息交換標準代碼**)是基于[拉丁字母](http://zh.wikipedia.org/wiki/%E6%8B%89%E4%B8%81%E5%AD%97%E6%AF%8D)的一套[電腦](http://zh.wikipedia.org/wiki/%E7%94%B5%E8%84%91 "電腦")[編碼](http://zh.wikipedia.org/wiki/%E7%BC%96%E7%A0%81)系統。它主要用于顯示[現代英語](http://zh.wikipedia.org/wiki/%E7%8F%BE%E4%BB%A3%E8%8B%B1%E8%AA%9E "現代英語"),而其擴展版本[](http://zh.wikipedia.org/wiki/EASCII)EASCII則可以勉強顯示其他[西歐](http://zh.wikipedia.org/wiki/%E8%A5%BF%E6%AC%A7)[語言](http://zh.wikipedia.org/wiki/%E8%AF%AD%E8%A8%80)。它是現今最通用的單[字節](http://zh.wikipedia.org/wiki/%E5%AD%97%E8%8A%82)編碼系統(但是有被[](http://zh.wikipedia.org/wiki/Unicode)Unicode追上的跡象),并等同于國際標準[](http://zh.wikipedia.org/wiki/ISO/IEC_646)**ISO/IEC 646**。 **ASCII字符集**:主要包括控制字符(回車鍵、退格、換行鍵等);可顯示字符(英文大小寫字符、阿拉伯數字和西文符號)。 **ASCII編碼**:將ASCII字符集轉換為計算機可以接受的數字系統的數的規則。使用7位(bits)表示一個字符,共128字符;但是7位編碼的字符集只能支持128個字符,為了表示更多的[歐洲](http://baike.baidu.com/view/3622.htm)常用字符對ASCII進行了擴展,ASCII擴展字符集使用8位(bits)表示一個字符,共256字符。ASCII字符集映射到數字編碼規則如下圖所示: ![](https://box.kancloud.cn/2016-01-19_569dd03c460ec.png) 圖1 ASCII編碼表 ![](https://box.kancloud.cn/2016-01-19_569dd03c81840.png) 圖2 擴展ASCII編碼表 ASCII的最大缺點是只能顯示26個基本拉丁字母、阿拉伯數字和英式標點符號,因此只能用于顯示現代美國英語(而且在處理英語當中的外來詞如na?ve、café、élite等等時,所有重音符號都不得不去掉,即使這樣做會違反拼寫規則)。而EASCII雖然解決了部份西歐語言的顯示問題,但對更多其他語言依然無能為力。因此現在的蘋果電腦已經拋棄ASCII而轉用[Unicode](http://zh.wikipedia.org/wiki/Unicode)。 ## 2.2\. GBXXXX字符集&編碼 計算機發明之后的很長一段時間,只用應用于美國及西方一些發達國家,ASCII能夠很好滿足用戶的需求。但是當天朝也有了計算機之后,為了顯示中文,必須設計一套編碼規則用于將漢字轉換為計算機可以接受的數字系統的數。 天朝專家把那些127號之后的奇異符號們(即EASCII)取消掉,規定:一個小于127的字符的意義與原來相同,但兩個大于127的字符連在一起時,就表示一個漢字,前面的一個字節(他稱之為高字節)從0xA1用到 0xF7,后面一個字節(低字節)從0xA1到0xFE,這樣我們就可以組合出大約7000多個簡體漢字了。在這些編碼里,還把數學符號、羅馬希臘的 字母、日文的假名們都編進去了,連在ASCII里本來就有的數字、標點、字母都統統重新編了兩個字節長的編碼,這就是常說的"全角"字符,而原來在127號以下的那些就叫"半角"字符了。 上述編碼規則就是**GB2312**。**GB2312**或**GB2312-80**是[中國國家標準](http://zh.wikipedia.org/wiki/%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD%E5%9B%BD%E5%AE%B6%E6%A0%87%E5%87%86 "中華人民共和國國家標準")[簡體中文](http://zh.wikipedia.org/wiki/%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)[字符集](http://zh.wikipedia.org/wiki/%E5%AD%97%E7%AC%A6%E9%9B%86 "字符集"),全稱《**信息交換用漢字編碼字符集·基本集**》,又稱[**GB0**](http://zh.wikipedia.org/wiki/%E5%9B%BD%E5%AE%B6%E6%A0%87%E5%87%86%E4%BB%A3%E7%A0%81 "國家標準代碼"),由[中國國家標準總局](http://zh.wikipedia.org/w/index.php?title=%E4%B8%AD%E5%9B%BD%E5%9B%BD%E5%AE%B6%E6%A0%87%E5%87%86%E6%80%BB%E5%B1%80&action=edit&redlink=1 "中國國家標準總局")發布,[1981年](http://zh.wikipedia.org/wiki/1981%E5%B9%B4)[5月1日](http://zh.wikipedia.org/wiki/5%E6%9C%881%E6%97%A5)實施。GB2312編碼通行于中國大陸;[新加坡](http://zh.wikipedia.org/wiki/%E6%96%B0%E5%8A%A0%E5%9D%A1)等地也采用此編碼。中國大陸幾乎所有的中文系統和國際化的軟件都支持GB2312。GB2312的出現,基本滿足了漢字的計算機處理需要,它所收錄的漢字已經覆蓋中國大陸99.75%的使用頻率。對于[人名](http://zh.wikipedia.org/wiki/%E4%BA%BA%E5%90%8D)、[古漢語](http://zh.wikipedia.org/wiki/%E5%8F%A4%E6%B1%89%E8%AF%AD "古漢語")等方面出現的[罕用字](http://zh.wikipedia.org/wiki/%E7%BD%95%E7%94%A8%E5%AD%97),GB2312不能處理,這導致了后來[GBK](http://zh.wikipedia.org/wiki/GBK)及[GB 18030](http://zh.wikipedia.org/wiki/GB_18030)漢字字符集的出現。下圖是GB2312編碼的開始部分(由于其非常龐大,只列舉開始部分,具體可查看[GB2312簡體中文編碼表](http://www.knowsky.com/resource/gb2312tbl.htm)): ![](https://box.kancloud.cn/2016-01-19_569dd03ca41d7.png) 圖3 GB2312編碼表的開始部分 由于[GB 2312-80](http://zh.wikipedia.org/wiki/GB_2312 "GB 2312")只收錄6763個漢字,有不少漢字,如部分在GB 2312-80推出以后才簡化的漢字(如"啰"),部分人名用字(如中國前總理[朱镕基](http://zh.wikipedia.org/wiki/%E6%9C%B1%E9%95%95%E5%9F%BA)的"镕"字),臺灣及香港使用的[繁體字](http://zh.wikipedia.org/wiki/%E7%B9%81%E4%BD%93%E4%B8%AD%E6%96%87 "繁體中文"),[日語](http://zh.wikipedia.org/wiki/%E6%97%A5%E8%AF%AD)及[朝鮮語](http://zh.wikipedia.org/wiki/%E9%9F%93%E8%AA%9E "韓語")漢字等,并未有收錄在內。于是廠商微軟利用GB 2312-80未使用的編碼空間,收錄GB 13000.1-93全部字符制定了GBK編碼。根據[微軟](http://zh.wikipedia.org/wiki/%E5%BE%AE%E8%BD%AF)資料,GBK是對GB2312-80的擴展,也就是[*CP936*](http://zh.wikipedia.org/w/index.php?title=CP936&action=edit&redlink=1 "CP936")*字碼表 (Code Page 936)*的擴展(之前CP936和GB 2312-80一模一樣),最早實現于[Windows 95](http://zh.wikipedia.org/wiki/Windows_95)簡體中文版。雖然GBK收錄[GB 13000.1-93](http://zh.wikipedia.org/wiki/GB_13000 "GB 13000")的全部字符,但編碼方式并不相同。GBK自身并非國家標準,只是曾由[國家技術監督局](http://zh.wikipedia.org/wiki/%E5%9B%BD%E5%AE%B6%E6%8A%80%E6%9C%AF%E7%9B%91%E7%9D%A3%E5%B1%80 "國家技術監督局")標準化司、[電子工業部](http://zh.wikipedia.org/wiki/%E7%94%B5%E5%AD%90%E5%B7%A5%E4%B8%9A%E9%83%A8 "電子工業部")科技與質量監督司公布為"技術規范指導性文件"。原始GB13000一直未被業界采用,后續國家標準[GB18030](http://zh.wikipedia.org/wiki/GB18030 "GB18030")技術上兼容GBK而非GB13000。 **GB 18030**,全稱:[國家標準](http://zh.wikipedia.org/wiki/%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD%E5%9B%BD%E5%AE%B6%E6%A0%87%E5%87%86 "中華人民共和國國家標準")GB 18030-2005《信息技術 中文編碼字符集》,是[中華人民共和國](http://zh.wikipedia.org/wiki/%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD)現時最新的內碼字集,是GB 18030-2000《信息技術 信息交換用漢字編碼字符集 基本集的擴充》的修訂版。與[GB?2312-1980](http://zh.wikipedia.org/wiki/GB_2312 "GB 2312")完全兼容,與[GBK](http://zh.wikipedia.org/wiki/GBK)基本兼容,支持[GB?13000](http://zh.wikipedia.org/wiki/GB_13000 "GB 13000")及[Unicode](http://zh.wikipedia.org/wiki/Unicode)的全部統一漢字,共收錄漢字70244個。GB 18030主要有以下特點: * 與[UTF-8](http://zh.wikipedia.org/wiki/UTF-8)相同,采用多[字節](http://zh.wikipedia.org/wiki/%E5%AD%97%E8%8A%82)編碼,每個字可以由1個、2個或4個字節組成。 * 編碼空間龐大,最多可定義161萬個字符。 * 支持中國國內[少數民族](http://zh.wikipedia.org/wiki/%E5%B0%91%E6%95%B0%E6%B0%91%E6%97%8F)的文字,不需要動用造字區。 * 漢字收錄范圍包含繁體漢字以及日韓漢字 ![](https://box.kancloud.cn/2016-01-19_569dd03cb4c5d.jpg) 圖4 GB18030編碼總體結構 本規格的初版使中華人民共和國信息產業部電子工業標準化研究所起草,由國家質量技術監督局于[2000年](http://zh.wikipedia.org/wiki/2000%E5%B9%B4)[3月17日](http://zh.wikipedia.org/wiki/3%E6%9C%8817%E6%97%A5)發布。現行版本為國家質量監督檢驗總局和中國國家標準化管理委員會于[2005年](http://zh.wikipedia.org/wiki/2005%E5%B9%B4)[11月8日](http://zh.wikipedia.org/wiki/11%E6%9C%888%E6%97%A5)發布,[2006年](http://zh.wikipedia.org/wiki/2006%E5%B9%B4)[5月1日](http://zh.wikipedia.org/wiki/5%E6%9C%881%E6%97%A5)實施。此規格為在中國境內所有軟件產品支持的強制規格。 ## 2.3\. BIG5字符集&編碼 **Big5**,又稱為**大五碼**或**五大碼**,是使用[繁體中文](http://zh.wikipedia.org/wiki/%E7%B9%81%E4%BD%93%E4%B8%AD%E6%96%87)(正體中文)社區中最常用的電腦[漢字](http://zh.wikipedia.org/wiki/%E6%B1%89%E5%AD%97 "漢字")[字符集](http://zh.wikipedia.org/wiki/%E5%AD%97%E7%AC%A6%E9%9B%86 "字符集")標準,共收錄13,060個漢字。中文碼分為[內碼](http://zh.wikipedia.org/wiki/%E5%85%A7%E7%A2%BC)及[交換碼](http://zh.wikipedia.org/wiki/%E4%BA%A4%E6%8F%9B%E7%A2%BC)兩類,Big5屬中文內碼,知名的中文交換碼有[CCCII](http://zh.wikipedia.org/wiki/CCCII "CCCII")、[CNS11643](http://zh.wikipedia.org/wiki/CNS11643 "CNS11643")。Big5雖普及于[臺灣](http://zh.wikipedia.org/wiki/%E5%8F%B0%E7%81%A3)、[香港](http://zh.wikipedia.org/wiki/%E4%B8%AD%E5%9C%8B%E9%A6%99%E6%B8%AF "中國香港")與[澳門](http://zh.wikipedia.org/wiki/%E4%B8%AD%E5%9C%8B%E6%BE%B3%E9%96%80 "中國澳門")等繁體中文通行區,但長期以來并非當地的國家標準,而只是[**業界標準**](http://zh.wikipedia.org/wiki/De_facto "De facto")。[倚天中文系統](http://zh.wikipedia.org/wiki/%E5%80%9A%E5%A4%A9%E4%B8%AD%E6%96%87%E7%B3%BB%E7%B5%B1)、[Windows](http://zh.wikipedia.org/wiki/Windows "Windows")等主要系統的字符集都是以Big5為基準,但廠商又各自增加不同的造字與造字區,派生成多種不同版本。[2003年](http://zh.wikipedia.org/wiki/2003%E5%B9%B4),Big5被收錄到CNS11643中文標準交換碼的附錄當中,取得了較正式的地位。這個最新版本被稱為Big5-2003。 Big5碼是一套[雙字節字符集](http://zh.wikipedia.org/wiki/%E5%8F%8C%E5%AD%97%E8%8A%82%E5%AD%97%E7%AC%A6%E9%9B%86 "雙字節字符集"),使用了雙八碼存儲方法,以兩個字節來安放一個字。第一個字節稱為"高位字節",第二個字節稱為"低位字節"。"高位字節"使用了0x81-0xFE,"低位字節"使用了0x40-0x7E,及0xA1-0xFE。在Big5的分區中: | **0x8140-0xA0FE**|**保留給用戶自定義字符([造字](http://zh.wikipedia.org/wiki/%E9%80%A0%E5%AD%97)區)**| |--|--| | **0xA140-0xA3BF**|[**標點符號**](http://zh.wikipedia.org/wiki/%E6%A8%99%E9%BB%9E%E7%AC%A6%E8%99%9F"標點符號")**、[](http://zh.wikipedia.org/wiki/%E5%B8%8C%E8%85%8A%E5%AD%97%E6%AF%8D "希臘字母")希臘字母及特殊符號,包括在0xA259-0xA261,安放了九個[](http://zh.wikipedia.org/wiki/%E8%A8%88%E9%87%8F%E7%94%A8%E6%BC%A2%E5%AD%97)計量用漢字:兙兛兞兝兡兣嗧瓩糎。**| | **0xA3C0-0xA3FE**| **保留。此區沒有開放作造字區用。**| | **0xA440-0xC67E**|[**常用漢字**](http://zh.wikipedia.org/wiki/%E5%B8%B8%E7%94%A8%E6%BC%A2%E5%AD%97)**,先按[](http://zh.wikipedia.org/wiki/%E7%AD%86%E5%8A%83 "筆劃")筆劃再按[](http://zh.wikipedia.org/wiki/%E5%BA%B7%E7%86%99%E5%AD%97%E5%85%B8 "康熙字典")部首排序。**| | **0xC6A1-0xC8FE**| **保留給用戶自定義字符(造字區)**| | **0xC940-0xF9D5**|[**次常用漢字**](http://zh.wikipedia.org/wiki/%E6%AC%A1%E5%B8%B8%E7%94%A8%E5%AD%97 "次常用字")**,亦是先按筆劃再按部首排序。**| | **0xF9D6-0xFEFE**| **保留給用戶自定義字符(造字區)**| Unicode字符集&UTF編碼 # 3.偉大的創想Unicode *——不得不單獨說Unicode* 像天朝一樣,當計算機傳到世界各個國家時,為了適合當地語言和字符,設計和實現類似GB232/GBK/GB18030/BIG5的編碼方案。這樣各搞一套,在本地使用沒有問題,一旦出現在網絡中,由于不兼容,互相訪問就出現了亂碼現象。 為了解決這個問題,一個偉大的創想產生了——Unicode。Unicode編碼系統為表達任意語言的任意字符而設計。它使用**4字節**的數字來表達每個字母、符號,或者表意文字(ideograph)。每個數字代表唯一的至少在某種語言中使用的符號。(并不是所有的數字都用上了,但是總數已經超過了65535,所以2個字節的數字是不夠用的。)被幾種語言共用的字符通常使用相同的數字來編碼,除非存在一個在理的語源學(etymological)理由使之不這樣做。不考慮這種情況的話,每個字符對應一個數字,每個數字對應一個字符。即不存在二義性。不再需要記錄"模式"了。U+0041總是代表'A',即使這種語言沒有'A'這個字符。 在[計算機科學](http://zh.wikipedia.org/wiki/%E9%9B%BB%E8%85%A6%E7%A7%91%E5%AD%B8 "計算機科學")領域中,**Unicode**(**統一碼**、**萬國碼**、**單一碼**、**標準萬國碼**)是業界的一種標準,它可以使電腦得以體現世界上數十種文字的系統。Unicode 是基于[通用字符集](http://zh.wikipedia.org/wiki/%E9%80%9A%E7%94%A8%E5%AD%97%E7%AC%A6%E9%9B%86 "通用字符集")(Universal Character Set)的標準來發展而來,并且同時也以書本的形式[[1]](http://zh.wikipedia.org/wiki/Unicode)對外發表。Unicode 還不斷在擴增, 每個新版本插入更多新的字符。直至目前為止的第六版,Unicode 就已經包含了超過十萬個[字符](http://zh.wikipedia.org/wiki/%E5%AD%97%E7%AC%A6)(在[2005年](http://zh.wikipedia.org/wiki/2005%E5%B9%B4),Unicode 的第十萬個字符被采納且認可成為標準之一)、一組可用以作為視覺參考的代碼圖表、一套編碼方法與一組標準[字符編碼](http://zh.wikipedia.org/wiki/%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81 "字符編碼")、一套包含了上標字、下標字等字符特性的枚舉等。Unicode 組織(The Unicode Consortium)是由一個非營利性的機構所運作,并主導 Unicode 的后續發展,其目標在于:將既有的字符編碼方案以Unicode 編碼方案來加以取代,特別是既有的方案在多語言環境下,皆僅有有限的空間以及不兼容的問題。 (**可以這樣理解:Unicode是字符集,UTF-32/ UTF-16/ UTF-8是三種字符編碼方案。**) ## 3.1.UCS & UNICODE **通用字符集**(Universal Character Set,**UCS**)是由[ISO](http://zh.wikipedia.org/wiki/%E5%9C%8B%E9%9A%9B%E6%A8%99%E6%BA%96%E5%8C%96%E7%B5%84%E7%B9%94 "國際標準化組織")制定的**ISO 10646**(或稱**ISO/IEC 10646**)標準所定義的標準字符集。歷史上存在兩個獨立的嘗試創立單一字符集的組織,即國際標準化組織(ISO)和多語言軟件制造商組成的[統一碼聯盟](http://zh.wikipedia.org/wiki/%E7%B5%B1%E4%B8%80%E7%A2%BC%E8%81%AF%E7%9B%9F)。前者開發的 ISO/IEC 10646 項目,后者開發的[統一碼](http://zh.wikipedia.org/wiki/%E7%B5%B1%E4%B8%80%E7%A2%BC "統一碼")項目。因此最初制定了不同的標準。 [1991年](http://zh.wikipedia.org/wiki/1991%E5%B9%B4)前后,兩個項目的參與者都認識到,世界不需要兩個不兼容的字符集。于是,它們開始合并雙方的工作成果,并為創立一個單一編碼表而協同工作。從Unicode 2.0開始,Unicode采用了與ISO 10646-1相同的字庫和字碼;ISO也承諾,ISO 10646將不會替超出U+10FFFF的UCS-4編碼賦值,以使得兩者保持一致。兩個項目仍都存在,并獨立地公布各自的標準。但統一碼聯盟和ISO/IEC JTC1/SC2都同意保持兩者標準的碼表兼容,并緊密地共同調整任何未來的擴展。在發布的時候,Unicode一般都會采用有關字碼最常見的字型,但ISO 10646一般都盡可能采用[Century字型](http://zh.wikipedia.org/w/index.php?title=Century%E5%AD%97%E5%9E%8B&action=edit&redlink=1 "Century字型")。 ## 3.2.UTF-32 上述使用4字節的數字來表達每個字母、符號,或者表意文字(ideograph),每個數字代表唯一的至少在某種語言中使用的符號的編碼方案,稱為UTF-32。UTF-32又稱**UCS-4**是一種將[Unicode](http://zh.wikipedia.org/wiki/Unicode)字符編碼的協定,對每個字符都使用4字節。就空間而言,是非常沒有效率的。 這種方法有其優點,最重要的一點就是可以在常數時間內定位字符串里的第N個字符,因為第N個字符從第4×Nth個字節開始。雖然每一個碼位使用固定長定的字節看似方便,它并不如其它Unicode編碼使用得廣泛。 ## 3.3.UTF-16 盡管有Unicode字符非常多,但是實際上大多數人不會用到超過前65535個以外的字符。因此,就有了另外一種Unicode編碼方式,叫做UTF-16(因為16位 = 2字節)。UTF-16將0–65535范圍內的字符編碼成2個字節,如果真的需要表達那些很少使用的"星芒層(astral plane)"內超過這65535范圍的Unicode字符,則需要使用一些詭異的技巧來實現。UTF-16編碼最明顯的優點是它在空間效率上比UTF-32高兩倍,因為每個字符只需要2個字節來存儲(除去65535范圍以外的),而不是UTF-32中的4個字節。并且,如果我們假設某個字符串不包含任何星芒層中的字符,那么我們依然可以在常數時間內找到其中的第N個字符,直到它不成立為止這總是一個不錯的推斷。其編碼方法是: * 如果字符編碼U小于0x10000,也就是十進制的0到65535之內,則直接使用兩字節表示; * 如果字符編碼U大于0x10000,由于UNICODE編碼范圍最大為0x10FFFF,從0x10000到0x10FFFF之間 共有0xFFFFF個編碼,也就是需要20個bit就可以標示這些編碼。用U'表示從0-0xFFFFF之間的值,將其前 10 bit作為高位和16 bit的數值0xD800進行 邏輯or 操作,將后10 bit作為低位和0xDC00做 邏輯or 操作,這樣組成的 4個byte就構成了U的編碼。 對于UTF-32和UTF-16編碼方式還有一些其他不明顯的缺點。不同的計算機系統會以不同的順序保存字節。這意味著字符U+4E2D在UTF-16編碼方式下可能被保存為4E 2D或者2D 4E,這取決于該系統使用的是大尾端(big-endian)還是小尾端(little-endian)。(對于UTF-32編碼方式,則有更多種可能的字節排列。)只要文檔沒有離開你的計算機,它還是安全的——同一臺電腦上的不同程序使用相同的字節順序(byte order)。但是當我們需要在跨系統之間傳輸這個文檔的時候,也許在萬維網中,我們就需要一種方法來指示當前我們的字節是怎樣存儲的。不然的話,接收文檔的計算機就無法知道這兩個字節4E 2D表達的到底是U+4E2D還是U+2D4E。 為了解決這個問題,多字節的Unicode編碼方式定義了一個"字節順序標記(Byte Order Mark)",它是一個特殊的非打印字符,你可以把它包含在文檔的開頭來指示你所使用的字節順序。對于UTF-16,字節順序標記是U+FEFF。如果收到一個以字節FF FE開頭的UTF-16編碼的文檔,你就能確定它的字節順序是單向的(one way)的了;如果它以FE FF開頭,則可以確定字節順序反向了。 ## 3.4.UTF-8 **UTF-8**(8-bit Unicode Transformation Format)是一種針對[Unicode](http://zh.wikipedia.org/wiki/Unicode)的可變長度[字符編碼](http://zh.wikipedia.org/wiki/%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81 "字符編碼")([定長碼](http://zh.wikipedia.org/w/index.php?title=%E5%AE%9A%E9%95%BF%E7%A0%81&action=edit&redlink=1 "定長碼")),也是一種[前綴碼](http://zh.wikipedia.org/w/index.php?title=%E5%89%8D%E7%BC%80%E7%A0%81&action=edit&redlink=1 "前綴碼")。它可以用來表示Unicode標準中的任何字符,且其編碼中的第一個[字節](http://zh.wikipedia.org/wiki/%E5%AD%97%E8%8A%82 "字節")仍與[ASCII](http://zh.wikipedia.org/wiki/ASCII)兼容,這使得原來處理ASCII字符的[軟件](http://zh.wikipedia.org/wiki/%E8%BB%9F%E9%AB%94 "軟件")無須或只須做少部份修改,即可繼續使用。因此,它逐漸成為[電子郵件](http://zh.wikipedia.org/wiki/%E9%9B%BB%E5%AD%90%E9%83%B5%E4%BB%B6 "電子郵件")、[網頁](http://zh.wikipedia.org/wiki/%E7%B6%B2%E9%A0%81)及其他[存儲](http://zh.wikipedia.org/wiki/%E5%84%B2%E5%AD%98%E8%A3%9D%E7%BD%AE "存儲設備")或傳送文字的應用中,優先采用的編碼。[互聯網工程工作小組](http://zh.wikipedia.org/wiki/%E7%B6%B2%E9%9A%9B%E7%B6%B2%E8%B7%AF%E5%B7%A5%E7%A8%8B%E5%B7%A5%E4%BD%9C%E5%B0%8F%E7%B5%84 "互聯網工程工作小組")(IETF)要求所有[互聯網](http://zh.wikipedia.org/wiki/%E7%B6%B2%E9%9A%9B%E7%B6%B2%E8%B7%AF "互聯網")[協議](http://zh.wikipedia.org/wiki/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE "網絡協議")都必須支持UTF-8編碼。 UTF-8使用一至四個[字節](http://zh.wikipedia.org/wiki/%E5%AD%97%E8%8A%82 "字節")為每個字符編碼: 1. 128個US-ASCII字符只需一個字節編碼(Unicode范圍由U+0000至U+007F)。 2. 帶有[附加符號](http://zh.wikipedia.org/wiki/%E9%99%84%E5%8A%A0%E7%AC%A6%E5%8F%B7)的[拉丁文](http://zh.wikipedia.org/wiki/%E6%8B%89%E4%B8%81%E6%96%87 "拉丁文")、[希臘文](http://zh.wikipedia.org/wiki/%E5%B8%8C%E8%87%98%E6%96%87 "希臘文")、[西里爾字母](http://zh.wikipedia.org/wiki/%E8%A5%BF%E9%87%8C%E7%88%BE%E5%AD%97%E6%AF%8D "西里爾字母")、[亞美尼亞語](http://zh.wikipedia.org/wiki/%E4%BA%9E%E7%BE%8E%E5%B0%BC%E4%BA%9E%E8%AA%9E "亞美尼亞語")、[希伯來文](http://zh.wikipedia.org/wiki/%E5%B8%8C%E4%BC%AF%E4%BE%86%E6%96%87 "希伯來文")、[阿拉伯文](http://zh.wikipedia.org/wiki/%E9%98%BF%E6%8B%89%E4%BC%AF%E6%96%87 "阿拉伯文")、[敘利亞文](http://zh.wikipedia.org/wiki/%E5%8F%99%E5%88%A9%E4%BA%9A%E6%96%87 "敘利亞文")及[它拿字母](http://zh.wikipedia.org/wiki/%E5%AE%83%E6%8B%BF%E5%AD%97%E6%AF%8D)則需要二個字節編碼(Unicode范圍由U+0080至U+07FF)。 3. 其他[基本多文種平面](http://zh.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E6%96%87%E7%A8%AE%E5%B9%B3%E9%9D%A2)(BMP)中的字符(這包含了大部分常用字)使用三個字節編碼。 4. 其他極少使用的Unicode[輔助平面](http://zh.wikipedia.org/wiki/%E8%BC%94%E5%8A%A9%E5%B9%B3%E9%9D%A2 "輔助平面")的字符使用四字節編碼。 在處理經常會用到的ASCII字符方面非常有效。在處理擴展的拉丁字符集方面也不比UTF-16差。對于中文字符來說,比UTF-32要好。同時,由位操作的天性使然,使用UTF-8不再存在字節順序的問題了,一份以utf-8編碼的文檔在不同的計算機之間是一樣的比特流(在這一條上你得相信我,因為我不打算給你展示它的數學原理)。 總體來說,在Unicode字符串中不可能由碼點數量決定顯示它所需要的長度,或者顯示字符串之后在文本緩沖區中光標應該放置的位置;組合字符、變寬字體、不可打印字符和從右至左的文字都是其歸因。所以盡管在UTF-8字符串中字符數量與碼點數量的關系比UTF-32更為復雜,在實際中很少會遇到有不同的情形。 **優點** * UTF-8是ASCII的一個[超集](http://zh.wikipedia.org/wiki/%E8%B6%85%E9%9B%86 "超集")。因為一個純ASCII字符串也是一個合法的UTF-8字符串,所以現存的ASCII文本不需要轉換。為傳統的擴展ASCII字符集設計的軟件通常可以不經修改或很少修改就能與UTF-8一起使用。 * 使用標準的面向字節的排序例程對UTF-8排序將產生與基于Unicode代碼點排序相同的結果。(盡管這只有有限的有用性,因為在任何特定語言或文化下都不太可能有仍可接受的文字排列順序。) * UTF-8和UTF-16都是[可擴展標記語言](http://zh.wikipedia.org/wiki/%E5%8F%AF%E6%89%A9%E5%B1%95%E6%A0%87%E8%AE%B0%E8%AF%AD%E8%A8%80 "可擴展標記語言")文檔的標準編碼。所有其它編碼都必須通過顯式或文本聲明來指定。 * 任何[面向字節](http://zh.wikipedia.org/w/index.php?title=%E9%9D%A2%E5%90%91%E5%AD%97%E8%8A%82&action=edit&redlink=1 "面向字節")的[字符串搜索算法](http://zh.wikipedia.org/wiki/%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%90%9C%E7%B4%A2%E7%AE%97%E6%B3%95)都可以用于UTF-8的數據(只要輸入僅由完整的UTF-8字符組成)。但是,對于包含字符記數的正則表達式或其它結構必須小心。 * UTF-8字符串可以由一個簡單的算法可靠地識別出來。就是,一個字符串在任何其它編碼中表現為合法的UTF-8的可能性很低,并隨字符串長度增長而減小。舉例說,字符值C0,C1,F5至FF從來沒有出現。為了更好的可靠性,可以使用正則表達式來統計非法過長和替代值(可以查看[W3 FAQ: Multilingual Forms](http://www.w3.org/International/questions/qa-forms-utf-8)上的驗證UTF-8字符串的正則表達式)。 **缺點** 因為每個字符使用不同數量的字節編碼,所以尋找串中第N個字符是一個O(N)復雜度的操作 — 即,串越長,則需要更多的時間來定位特定的字符。同時,還需要位變換來把字符編碼成字節,把字節解碼成字符。 # 4.Accept-Charset/Accept-Encoding/Accept-Language/Content-Type/Content-Encoding/Content-Language 在HTTP中,與字符集和字符編碼相關的消息頭是Accept-Charset/Content-Type,另外主要區分Accept-Charset/Accept-Encoding/Accept-Language/Content-Type/Content-Encoding/Content-Language: Accept-Charset:瀏覽器申明自己接收的字符集,這就是本文前面介紹的各種字符集和字符編碼,如gb2312,utf-8(通常我們說Charset包括了相應的字符編碼方案); Accept-Encoding:瀏覽器申明自己接收的編碼方法,通常指定壓縮方法,是否支持壓縮,支持什么壓縮方法(gzip,deflate),(注意:這不是只字符編碼); Accept-Language:瀏覽器申明自己接收的語言。語言跟字符集的區別:中文是語言,中文有多種字符集,比如big5,gb2312,gbk等等; Content-Type:WEB服務器告訴瀏覽器自己響應的對象的類型和字符集。例如:Content-Type: text/html; charset='gb2312' Content-Encoding:WEB服務器表明自己使用了什么壓縮方法(gzip,deflate)壓縮響應中的對象。例如:Content-Encoding:gzip Content-Language:WEB服務器告訴瀏覽器自己響應的對象的語言。 # 參考文獻&進一步閱讀 1. 百度百科. 字符集.?[http://baike.baidu.com/view/51987.htm](http://baike.baidu.com/view/51987.htm), 2010-12-28 2. 維基百科. 字符編碼.?[http://zh.wikipedia.org/wiki/%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81](http://zh.wikipedia.org/wiki/%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81), 2011-1-5 3. 維基百科. ASCII.?[http://zh.wikipedia.org/wiki/ASCII](http://zh.wikipedia.org/wiki/ASCII), 2011-4-5 4. 維基百科. GB2312.?[http://zh.wikipedia.org/wiki/GB_2312](http://zh.wikipedia.org/wiki/GB_2312), 2011-3-17 5. 維基百科. GB18030.?[http://zh.wikipedia.org/wiki/GB_18030](http://zh.wikipedia.org/wiki/GB_18030), 2010-3-10 6. 維基百科. GBK.?[http://zh.wikipedia.org/wiki/GBK](http://zh.wikipedia.org/wiki/GBK), 2011-3-7 7. 維基百科. Unicode.?[http://zh.wikipedia.org/wiki/Unicode](http://zh.wikipedia.org/wiki/Unicode), 2011-4-30 8. Laruence. 字符編碼詳解(基礎).?[http://www.laruence.com/2009/08/22/1059.html](http://www.laruence.com/2009/08/22/1059.html), 2009-8-22 9. Jan Hunt. Character Sets and Encoding for Web Designers - UCS/UNICODE.[http://www.uninetnews.com/other_standards/charset.php](http://www.uninetnews.com/other_standards/charset.php)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看