日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(个人理解+转载)ANSI/ASCII/UTF8/UNICODE/GB2312/UCS-2/UTF16-文本的编码格式

發(fā)布時(shí)間:2023/12/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (个人理解+转载)ANSI/ASCII/UTF8/UNICODE/GB2312/UCS-2/UTF16-文本的编码格式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

參考文檔:

http://baike.baidu.com/view/443268.htm?fromId=25492

http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html?

http://tech.idv2.com/2008/02/21/unicode-intro/

http://baike.baidu.com/view/185282.htm

http://baike.baidu.com/view/40801.htm

http://hilojack.sinaapp.com/?p=1291

?

個(gè)人學(xué)到的先附加在如下:

ASCII

1. ASCII碼只表示128個(gè)字符,最前面一位為0. ASCII是計(jì)算機(jī)的一個(gè)基礎(chǔ)存儲(chǔ)格式。其他存儲(chǔ)格式也都為它做了預(yù)留。

?

Unicode與UCS2\UTF8\UTF16

1. Unicode(統(tǒng)一碼、萬國碼、單一碼)是一種在計(jì)算機(jī)上使用的字符編碼。UCS-2用兩個(gè)字節(jié)編碼,UCS-4用4個(gè)字節(jié)編碼。

??? 我們通常Windows上見到的Unicode,不做說明的情況下,都是指的UCS-2這種字節(jié)編碼。

2. Unicode UCS2使用兩個(gè)字節(jié)來存儲(chǔ),是我們大多數(shù)情況都用到的uniocde方式,代碼中使用也很方便(w_char)-雙字節(jié)與它直接對(duì)應(yīng)起來了。

3. UTF8使用的也非常普遍,它也是一種unicode的編碼格式,它存在1/2/3/4個(gè)字節(jié)來表示一個(gè)文字。對(duì)于英文字符來說,使用空間非常小?!?/p>

4. UCS2與UTF16: UCS-2是UTF-16的子集,僅支持Unicode字符平面映射中的基本多文平面.占2個(gè)字節(jié). 參考:http://hilojack.sinaapp.com/?p=1291

?

ANSI與GB2312

1. ANSI: unicode和ansi都是字符代碼的一種表示形式,使用1-2字節(jié)表示一個(gè)字符。ANSI為使計(jì)算機(jī)支持更多語言,通常使用 0x80~0xFF 范圍的 2 個(gè)字節(jié)來表示 1 個(gè)字符。不同的國家和地區(qū)制定了不同的標(biāo)準(zhǔn),由此產(chǎn)生了 GB2312, BIG5, JIS 等各自的編碼標(biāo)準(zhǔn)。

2. GB2312是一種本地化的編碼格式,是ANSI字符代碼的一種編碼格式,相同的值,在其他本地語言體系里,表達(dá)的東西是不同的?!缎畔⒔粨Q用漢字編碼字符集》是由中國國家標(biāo)準(zhǔn)總局1980年發(fā)布,1981年5月1日開始實(shí)施的一套國家標(biāo)準(zhǔn),標(biāo)準(zhǔn)號(hào)是GB 2312—1980。

參考:http://baike.baidu.com/view/443268.htm?fromId=25492

?

?

?

?

下面為轉(zhuǎn)載內(nèi)容:地址如下

http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html?

-------------------------------------------------------------

字符編碼筆記:ASCII,Unicode和UTF-8

?

作者: 阮一峰

今天中午,我突然想搞清楚Unicode和UTF-8之間的關(guān)系,于是就開始在網(wǎng)上查資料。

結(jié)果,這個(gè)問題比我想象的復(fù)雜,從午飯后一直看到晚上9點(diǎn),才算初步搞清楚。

下面就是我的筆記,主要用來整理自己的思路。但是,我盡量試圖寫得通俗易懂,希望能對(duì)其他朋友有用。畢竟,字符編碼是計(jì)算機(jī)技術(shù)的基石,想要熟練使用計(jì)算機(jī),就必須懂得一點(diǎn)字符編碼的知識(shí)。

1. ASCII碼

我們知道,在計(jì)算機(jī)內(nèi)部,所有的信息最終都表示為一個(gè)二進(jìn)制的字符串。每一個(gè)二進(jìn)制位(bit)有0和1兩種狀態(tài),因此八個(gè)二進(jìn)制位就可以組合出256種狀態(tài),這被稱為一個(gè)字節(jié)(byte)。也就是說,一個(gè)字節(jié)一共可以用來表示256種不同的狀態(tài),每一個(gè)狀態(tài)對(duì)應(yīng)一個(gè)符號(hào),就是256個(gè)符號(hào),從0000000到11111111。

上個(gè)世紀(jì)60年代,美國制定了一套字符編碼,對(duì)英語字符與二進(jìn)制位之間的關(guān)系,做了統(tǒng)一規(guī)定。這被稱為ASCII碼,一直沿用至今。

ASCII碼一共規(guī)定了128個(gè)字符的編碼,比如空格"SPACE"是32(二進(jìn)制00100000),大寫的字母A是65(二進(jìn)制01000001)。這128個(gè)符號(hào)(包括32個(gè)不能打印出來的控制符號(hào)),只占用了一個(gè)字節(jié)的后面7位,最前面的1位統(tǒng)一規(guī)定為0。

2、非ASCII編碼

英語用128個(gè)符號(hào)編碼就夠了,但是用來表示其他語言,128個(gè)符號(hào)是不夠的。比如,在法語中,字母上方有注音符號(hào),它就無法用ASCII碼表示。于是,一些歐洲國家就決定,利用字節(jié)中閑置的最高位編入新的符號(hào)。比如,法語中的é的編碼為130(二進(jìn)制10000010)。這樣一來,這些歐洲國家使用的編碼體系,可以表示最多256個(gè)符號(hào)。

但是,這里又出現(xiàn)了新的問題。不同的國家有不同的字母,因此,哪怕它們都使用256個(gè)符號(hào)的編碼方式,代表的字母卻不一樣。比如,130在法語編碼中代表了é,在希伯來語編碼中卻代表了字母Gimel (?),在俄語編碼中又會(huì)代表另一個(gè)符號(hào)。但是不管怎樣,所有這些編碼方式中,0--127表示的符號(hào)是一樣的,不一樣的只是128--255的這一段。

至于亞洲國家的文字,使用的符號(hào)就更多了,漢字就多達(dá)10萬左右。一個(gè)字節(jié)只能表示256種符號(hào),肯定是不夠的,就必須使用多個(gè)字節(jié)表達(dá)一個(gè)符號(hào)。比如,簡體中文常見的編碼方式是GB2312,使用兩個(gè)字節(jié)表示一個(gè)漢字,所以理論上最多可以表示256x256=65536個(gè)符號(hào)。

中文編碼的問題需要專文討論,這篇筆記不涉及。這里只指出,雖然都是用多個(gè)字節(jié)表示一個(gè)符號(hào),但是GB類的漢字編碼與后文的Unicode和UTF-8是毫無關(guān)系的。

3.Unicode

正如上一節(jié)所說,世界上存在著多種編碼方式,同一個(gè)二進(jìn)制數(shù)字可以被解釋成不同的符號(hào)。因此,要想打開一個(gè)文本文件,就必須知道它的編碼方式,否則用錯(cuò)誤的編碼方式解讀,就會(huì)出現(xiàn)亂碼。為什么電子郵件常常出現(xiàn)亂碼?就是因?yàn)榘l(fā)信人和收信人使用的編碼方式不一樣。

可以想象,如果有一種編碼,將世界上所有的符號(hào)都納入其中。每一個(gè)符號(hào)都給予一個(gè)獨(dú)一無二的編碼,那么亂碼問題就會(huì)消失。這就是Unicode,就像它的名字都表示的,這是一種所有符號(hào)的編碼。

Unicode當(dāng)然是一個(gè)很大的集合,現(xiàn)在的規(guī)??梢匀菁{100多萬個(gè)符號(hào)。每個(gè)符號(hào)的編碼都不一樣,比如,U+0639表示阿拉伯字母Ain,U+0041表示英語的大寫字母A,U+4E25表示漢字"嚴(yán)"。具體的符號(hào)對(duì)應(yīng)表,可以查詢unicode.org,或者專門的漢字對(duì)應(yīng)表。

4. Unicode的問題

需要注意的是,Unicode只是一個(gè)符號(hào)集,它只規(guī)定了符號(hào)的二進(jìn)制代碼,卻沒有規(guī)定這個(gè)二進(jìn)制代碼應(yīng)該如何存儲(chǔ)。

比如,漢字"嚴(yán)"的unicode是十六進(jìn)制數(shù)4E25,轉(zhuǎn)換成二進(jìn)制數(shù)足足有15位(100111000100101),也就是說這個(gè)符號(hào)的表示至少需要2個(gè)字節(jié)。表示其他更大的符號(hào),可能需要3個(gè)字節(jié)或者4個(gè)字節(jié),甚至更多。

這里就有兩個(gè)嚴(yán)重的問題,第一個(gè)問題是,如何才能區(qū)別Unicode和ASCII?計(jì)算機(jī)怎么知道三個(gè)字節(jié)表示一個(gè)符號(hào),而不是分別表示三個(gè)符號(hào)呢?第二個(gè)問題是,我們已經(jīng)知道,英文字母只用一個(gè)字節(jié)表示就夠了,如果Unicode統(tǒng)一規(guī)定,每個(gè)符號(hào)用三個(gè)或四個(gè)字節(jié)表示,那么每個(gè)英文字母前都必然有二到三個(gè)字節(jié)是0,這對(duì)于存儲(chǔ)來說是極大的浪費(fèi),文本文件的大小會(huì)因此大出二三倍,這是無法接受的。

它們?cè)斐傻慕Y(jié)果是:1)出現(xiàn)了Unicode的多種存儲(chǔ)方式,也就是說有許多種不同的二進(jìn)制格式,可以用來表示Unicode。2)Unicode在很長一段時(shí)間內(nèi)無法推廣,直到互聯(lián)網(wǎng)的出現(xiàn)。

5.UTF-8

互聯(lián)網(wǎng)的普及,強(qiáng)烈要求出現(xiàn)一種統(tǒng)一的編碼方式。UTF-8就是在互聯(lián)網(wǎng)上使用最廣的一種Unicode的實(shí)現(xiàn)方式。其他實(shí)現(xiàn)方式還包括UTF-16(字符用兩個(gè)字節(jié)或四個(gè)字節(jié)表示)和UTF-32(字符用四個(gè)字節(jié)表示),不過在互聯(lián)網(wǎng)上基本不用。重復(fù)一遍,這里的關(guān)系是,UTF-8是Unicode的實(shí)現(xiàn)方式之一。

UTF-8最大的一個(gè)特點(diǎn),就是它是一種變長的編碼方式。它可以使用1~4個(gè)字節(jié)表示一個(gè)符號(hào),根據(jù)不同的符號(hào)而變化字節(jié)長度。

UTF-8的編碼規(guī)則很簡單,只有二條:

1)對(duì)于單字節(jié)的符號(hào),字節(jié)的第一位設(shè)為0,后面7位為這個(gè)符號(hào)的unicode碼。因此對(duì)于英語字母,UTF-8編碼和ASCII碼是相同的。

2)對(duì)于n字節(jié)的符號(hào)(n>1),第一個(gè)字節(jié)的前n位都設(shè)為1,第n+1位設(shè)為0,后面字節(jié)的前兩位一律設(shè)為10。剩下的沒有提及的二進(jìn)制位,全部為這個(gè)符號(hào)的unicode碼。

下表總結(jié)了編碼規(guī)則,字母x表示可用編碼的位。

Unicode符號(hào)范圍 | UTF-8編碼方式
(十六進(jìn)制) | (二進(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

下面,還是以漢字"嚴(yán)"為例,演示如何實(shí)現(xiàn)UTF-8編碼。

已知"嚴(yán)"的unicode是4E25(100111000100101),根據(jù)上表,可以發(fā)現(xiàn)4E25處在第三行的范圍內(nèi)(0000 0800-0000 FFFF),因此"嚴(yán)"的UTF-8編碼需要三個(gè)字節(jié),即格式是"1110xxxx 10xxxxxx 10xxxxxx"。然后,從"嚴(yán)"的最后一個(gè)二進(jìn)制位開始,依次從后向前填入格式中的x,多出的位補(bǔ)0。這樣就得到了,"嚴(yán)"的UTF-8編碼是"11100100 10111000 10100101",轉(zhuǎn)換成十六進(jìn)制就是E4B8A5。

6. Unicode與UTF-8之間的轉(zhuǎn)換

通過上一節(jié)的例子,可以看到"嚴(yán)"的Unicode碼是4E25,UTF-8編碼是E4B8A5,兩者是不一樣的。它們之間的轉(zhuǎn)換可以通過程序?qū)崿F(xiàn)。

在Windows平臺(tái)下,有一個(gè)最簡單的轉(zhuǎn)化方法,就是使用內(nèi)置的記事本小程序Notepad.exe。打開文件后,點(diǎn)擊"文件"菜單中的"另存為"命令,會(huì)跳出一個(gè)對(duì)話框,在最底部有一個(gè)"編碼"的下拉條。

里面有四個(gè)選項(xiàng):ANSI,Unicode,Unicode big endian 和 UTF-8。

1)ANSI是默認(rèn)的編碼方式。對(duì)于英文文件是ASCII編碼,對(duì)于簡體中文文件是GB2312編碼(只針對(duì)Windows簡體中文版,如果是繁體中文版會(huì)采用Big5碼)。

2)Unicode編碼指的是UCS-2編碼方式,即直接用兩個(gè)字節(jié)存入字符的Unicode碼。這個(gè)選項(xiàng)用的little endian格式。

3)Unicode big endian編碼與上一個(gè)選項(xiàng)相對(duì)應(yīng)。我在下一節(jié)會(huì)解釋little endian和big endian的涵義。

4)UTF-8編碼,也就是上一節(jié)談到的編碼方法。

選擇完"編碼方式"后,點(diǎn)擊"保存"按鈕,文件的編碼方式就立刻轉(zhuǎn)換好了。

7. Little endian和Big endian

上一節(jié)已經(jīng)提到,Unicode碼可以采用UCS-2格式直接存儲(chǔ)。以漢字"嚴(yán)"為例,Unicode碼是4E25,需要用兩個(gè)字節(jié)存儲(chǔ),一個(gè)字節(jié)是4E,另一個(gè)字節(jié)是25。存儲(chǔ)的時(shí)候,4E在前,25在后,就是Big endian方式;25在前,4E在后,就是Little endian方式。

這兩個(gè)古怪的名稱來自英國作家斯威夫特的《格列佛游記》。在該書中,小人國里爆發(fā)了內(nèi)戰(zhàn),戰(zhàn)爭起因是人們爭論,吃雞蛋時(shí)究竟是從大頭(Big-Endian)敲開還是從小頭(Little-Endian)敲開。為了這件事情,前后爆發(fā)了六次戰(zhàn)爭,一個(gè)皇帝送了命,另一個(gè)皇帝丟了王位。

因此,第一個(gè)字節(jié)在前,就是"大頭方式"(Big endian),第二個(gè)字節(jié)在前就是"小頭方式"(Little endian)。

那么很自然的,就會(huì)出現(xiàn)一個(gè)問題:計(jì)算機(jī)怎么知道某一個(gè)文件到底采用哪一種方式編碼?

Unicode規(guī)范中定義,每一個(gè)文件的最前面分別加入一個(gè)表示編碼順序的字符,這個(gè)字符的名字叫做"零寬度非換行空格"(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。這正好是兩個(gè)字節(jié),而且FF比FE大1。

如果一個(gè)文本文件的頭兩個(gè)字節(jié)是FE FF,就表示該文件采用大頭方式;如果頭兩個(gè)字節(jié)是FF FE,就表示該文件采用小頭方式。

8. 實(shí)例

下面,舉一個(gè)實(shí)例。

打開"記事本"程序Notepad.exe,新建一個(gè)文本文件,內(nèi)容就是一個(gè)"嚴(yán)"字,依次采用ANSI,Unicode,Unicode big endian 和 UTF-8編碼方式保存。

然后,用文本編輯軟件UltraEdit中的"十六進(jìn)制功能",觀察該文件的內(nèi)部編碼方式。

1)ANSI:文件的編碼就是兩個(gè)字節(jié)"D1 CF",這正是"嚴(yán)"的GB2312編碼,這也暗示GB2312是采用大頭方式存儲(chǔ)的。

2)Unicode:編碼是四個(gè)字節(jié)"FF FE 25 4E",其中"FF FE"表明是小頭方式存儲(chǔ),真正的編碼是4E25。

3)Unicode big endian:編碼是四個(gè)字節(jié)"FE FF 4E 25",其中"FE FF"表明是大頭方式存儲(chǔ)。

4)UTF-8:編碼是六個(gè)字節(jié)"EF BB BF E4 B8 A5",前三個(gè)字節(jié)"EF BB BF"表示這是UTF-8編碼,后三個(gè)"E4B8A5"就是"嚴(yán)"的具體編碼,它的存儲(chǔ)順序與編碼順序是一致的。

9. 延伸閱讀

* The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets(關(guān)于字符集的最基本知識(shí))

* 談?wù)刄nicode編碼

* RFC3629:UTF-8, a transformation format of ISO 10646(如果實(shí)現(xiàn)UTF-8的規(guī)定)

?

?

以下是轉(zhuǎn)載內(nèi)容,轉(zhuǎn)載地址:

http://hilojack.sinaapp.com/?p=1291

-----------------------------------------------------------------------------

04 五 13 字符編碼入門

本文試圖理清字符編碼系統(tǒng)的整體結(jié)構(gòu).如有理解不對(duì)請(qǐng)指正.

字符編碼

按照[現(xiàn)代的編碼模型],字符編碼的主要概念分為:有哪些字符(字符表)、它們的編號(hào)(編碼字符集)、這些編號(hào)如何編碼成一系列的“碼元”(字符編碼表)、這些碼元如何組成八位字節(jié)流(字符編碼方案).

字符表(Character Repotire)

一個(gè)系統(tǒng)所有抽象字符的集合,包括我們看得見的漢字/數(shù)字/符號(hào)和看不見的控制字符.unicode系統(tǒng)所使用的字符集是通用字符集UCS ,由ISO 10646所定義.

編碼字符集(CCS:Coded Character Set)

將字符集C映射到非負(fù)整數(shù)(碼位:編碼字符的位置).如unicode字符平面映射.即完成對(duì)字符的編號(hào).

unicode系統(tǒng)中的碼位也叫unicode編碼.

字符編碼表(CEF:Caracter Encoding Form)

將碼位轉(zhuǎn)換成有限比特長度的整數(shù)值(碼元/碼值:字符編碼的值)

在unicode系統(tǒng)中,其碼位可被轉(zhuǎn)換成8位串行的UTF-8,或者16位串行的UTF-16等等.也就說同一碼位對(duì)應(yīng)多個(gè)碼值.
碼元(Code Unit,也稱“代碼單元”)是指一個(gè)已編碼的文本中具有最短的比特組合的單元。對(duì)于UTF-8來說,碼元是8比特長;對(duì)于UTF-16來說,碼元是16比特長;對(duì)于UTF-32來說,碼元是32比特長。編碼長度是碼元的整數(shù)倍,如UTF-16的長度就是2字節(jié)/4字節(jié)(一對(duì)碼元)

我們平時(shí)所說的UTF-8,UTF-16都處于字符編碼表(CEF)的層面.

字符編碼方案(CES:Caracter Encodeing Scheme)

定義如何將碼值對(duì)應(yīng)到8位組的串行,以便網(wǎng)絡(luò)傳輸和文件存儲(chǔ).
這里有兩個(gè)大背景:

  • 對(duì)于多字節(jié)的UTF-16來說,windows是先讀高字節(jié)再讀低字節(jié),而MAC則相反.為了標(biāo)識(shí)字節(jié)順序,就選擇了一個(gè)字節(jié)序列標(biāo)記(BOM:Byte Order Mark)來指定大端序(UTF-16 BE)和小端序(UTF-16).見UTF-16的編碼模式
  • 有些復(fù)雜的編碼需要特別的方案:如ISO/IEC 2022需要使用轉(zhuǎn)義串行,如SCSU、BOCU和Punycode需要壓縮
  • 在vim中,:%xxd 可查看相關(guān)字符的編碼 :set fileencoding=**可對(duì)字符進(jìn)行編碼轉(zhuǎn)換

    unicode編碼體系

    unicode又名統(tǒng)一碼、萬國碼、單一碼、標(biāo)準(zhǔn)萬國碼

    意義

    因多語言環(huán)境的需要而誕生,它對(duì)應(yīng)于ISO 10646通用字符集UCS,包括了其它所有字符集/已知語言的所有字符.

    unicode與iso 10646

    史上存在兩個(gè)嘗試創(chuàng)立單一字符集的組織:

  • 國際標(biāo)準(zhǔn)化組織ISO——開發(fā)了ISO/IEC 10646項(xiàng)目
  • 統(tǒng)一碼聯(lián)盟Unicode Consortium——開發(fā)了統(tǒng)一碼項(xiàng)目
  • 1991年前后,兩個(gè)項(xiàng)目的參與者都認(rèn)識(shí)到,世界不需要兩個(gè)不兼容的字符集。于是,它們開始合并雙方的工作成果,并為創(chuàng)立一個(gè)單一編碼表而協(xié)同工作.

    到現(xiàn)在兩個(gè)項(xiàng)目仍都存在,兩者使用同一字符集,但二者本質(zhì)上是不同的標(biāo)準(zhǔn)——unicode標(biāo)準(zhǔn)更為豐富,它額外定義了許多與字符相關(guān)的語義符號(hào)學(xué),并且部分樣例字形與iso 10646有顯著區(qū)別。

    unicode的編碼和實(shí)現(xiàn)

    一般,unicode編碼系統(tǒng)分為編碼方式(CCS)和實(shí)現(xiàn)方式(CEF/CES …).

    unicode編碼方式(CCS)

    統(tǒng)一碼(unicode)的編碼方式使用的是通用字符集UCS. unicode字符的平面映射本質(zhì)上就是CCS碼位映射,即對(duì)字符的編號(hào)(ISO/IEC 10646-1所定義) (CCS)
    這個(gè)碼位就叫unicode編碼.

  • UCS-2:包含字符平面映射中的基本多文種平面,占16位,可表達(dá)2^16=65536個(gè)字符.2. UCS-4:其中已經(jīng)定義了16個(gè)輔助平面.標(biāo)準(zhǔn)規(guī)定的UCS-4會(huì)占用32個(gè)字節(jié),最高字節(jié)恒為0,可表達(dá)2^31個(gè)字符.
  • 平面始末字符值中文名稱英文名稱
    0號(hào)平面U+0000 – U+FFFF基本多文種平面Basic Multilingual Plane, 簡稱 BMP
    1號(hào)平面U+10000 – U+1FFFF多文種補(bǔ)充平面Supplementary Multilingual Plane, 簡稱 SMP
    2號(hào)平面U+20000 – U+2FFFF表意文字補(bǔ)充平面Supplementary Ideographic Plane, 簡稱 SIP
    3號(hào)平面U+30000 – U+3FFFF表意文字第三平面(未正式使用[1]Tertiary Ideographic Plane, 簡稱 TIP
    4號(hào)平面

    13號(hào)平面
    U+40000 – U+DFFFF(尚未使用)?
    14號(hào)平面U+E0000 – U+EFFFF特別用途補(bǔ)充平面Supplementary Special-purpose Plane, 簡稱 SSP
    15號(hào)平面U+F0000 – U+FFFFF保留作為私人使用區(qū)(A區(qū))[2]Private Use Area-A, 簡稱 PUA-A
    16號(hào)平面U+100000 – U+10FFFF保留作為私人使用區(qū)(B區(qū))[2]Private Use Area-B, 簡稱 PUA-B

    實(shí)現(xiàn)方式(CEF/CES …)

    在unicode編碼體系中unicode碼位轉(zhuǎn)為實(shí)際存儲(chǔ)的編碼(碼值)可以有不同實(shí)現(xiàn)方式.比如UTF8/UTF-16/UTF-32

    在unicode體系中碼位是唯一的,所以字符編碼轉(zhuǎn)換程序 在轉(zhuǎn)碼時(shí) 一般把碼值轉(zhuǎn)為unicode再轉(zhuǎn)為其它的編碼.

    字節(jié)順序標(biāo)記(BOM)

    BOM是用來標(biāo)記字節(jié)序的. 在windows/mac中,UTF-16高低字節(jié)的存儲(chǔ)順序是不同的,為了以示區(qū)別,特別定義的大尾序和小尾序.同時(shí)在文件頭部加入一個(gè)BOM頭(Byte Order Mark).
    對(duì)于UTF-8來說,它只是一個(gè)UTF-8編碼記號(hào)(不建議使用,它會(huì)干擾很多程序的執(zhí)行)

    建議在編輯器中取消bom,比如在vim設(shè)置:set nobomb

    編碼表示 (十六進(jìn)制)表示 (十進(jìn)制)
    UTF-8EF BB BF239 187 191
    UTF-16(大端序)FE FF254 255
    UTF-16(小端序)FF FE255 254
    UTF-32(大端序)00 00 FE FF0 0 254 255
    UTF-32(小端序)FF FE 00 00255 254 0 0
    UTF-72B 2F 76和以下的一個(gè)字節(jié):[ 38 | 39 | 2B | 2F ]43 47 118和以下的一個(gè)字節(jié):[ 56 | 57 | 43 | 47 ]
    en:UTF-1F7 64 4C247 100 76
    en:UTF-EBCDICDD 73 66 73221 115 102 115
    en:Standard Compression Scheme for Unicode0E FE FF14 254 255
    en:BOCU-1FB EE 28 及可能跟隨著FF251 238 40 及可能跟隨著255
    GB-1803084 31 95 33132 49 149 51
    使用UTF-16編碼的例子編碼名稱編碼次序編碼BOM朱,聿
    UTF-16LE小尾序?31 672C 007F 8069 D8 A5 DE
    UTF-16BE大尾序?67 3100 2C80 7FD8 69 DE A5
    UTF-16小尾序,包含BOMFF FE31 672C 007F 8069 D8 A5 DE
    UTF-16大尾序,包含BOMFE FF67 3100 2C80 7FD8 69 DE A5

    UTF-16/UCS-2

    UTF-16是Unicode字符集的一種轉(zhuǎn)換方式(Unicode Transfomation Format),它把unicode碼位轉(zhuǎn)為16比特長的碼元.
    字符長度:2個(gè)字節(jié)(16比特),4個(gè)字節(jié)(一對(duì)16比特碼元)

    UCS-2是UTF-16的子集,僅支持Unicode字符平面映射中的基本多文平面.占2個(gè)字節(jié).

    字符編碼表(CEF)

    對(duì)于unicoe基本多文平面(0×0000~0xffff).UTF-16的編碼為一個(gè)16比特:

    UTF-16 == Unicode(0x0~0xffff) #不含(0xd800~0xdfff),這個(gè)區(qū)保留給UTF-16的前導(dǎo)代理和后導(dǎo)代理

    對(duì)于uncide輔助平面(0×10000~0x10ffff),UTF-16的編碼為一對(duì)16比特字符串,由前導(dǎo)代理(lead surrogates)和后導(dǎo)代理(trail surrogates)組成.

    將unicode碼元(0x10000~0x10ffff)減去0x10000得到20位比特:0x0~0xfffff,這20位比特分高10位A(0~0x3ff)和低10位B(0~0x3ff) UTF-16(lead surrogates) == A+0xd800 #值范圍(0xd800~0xdbff) UTF-16(trail surrogates) == B+0xd800 #值范圍(0xdc00~0xdfff)

    UTF-16字符匹配正則

    根據(jù)UTF-16的CEF規(guī)則,我們可以得到關(guān)于匹配UTF-16字符的正則偽代碼(這個(gè)正則是無法執(zhí)行的,可執(zhí)行的正則可比這個(gè)可復(fù)雜多了):

    '#[\x{0000}-\x{d7ff}] |[\x{e000}-\x{ffff}] |([\x{d800}-\x{dbff}][\x{dc00}-\x{dfff}])#'

    UTF-8

    utf8以8位為單元對(duì)UCS進(jìn)行編碼,編碼會(huì)占用1~4字節(jié).與utf16所編碼的英文字符相比,它的編碼長度減少一半.

    UTF-8 字符編碼表CEF

    代碼范圍
    十六進(jìn)制標(biāo)量值(scalar value)
    二進(jìn)制UTF-8
    二進(jìn)制/十六進(jìn)制注釋
    000000 – 00007F
    128個(gè)代碼
    00000000 00000000 0zzzzzzz0zzzzzzz(00-7F)ASCII字符范圍,字節(jié)由零開始
    七個(gè)z七個(gè)z
    000080 – 0007FF
    1920個(gè)代碼
    00000000 00000yyy yyzzzzzz110yyyyy(C0-DF) 10zzzzzz(80-BF)第一個(gè)字節(jié)由110開始,接著的字節(jié)由10開始
    三個(gè)y;二個(gè)y;六個(gè)z五個(gè)y;六個(gè)z
    000800 – 00D7FF
    00E000 – 00FFFF
    61440個(gè)代碼 [Note 1]
    00000000 xxxxyyyy yyzzzzzz1110xxxx(E0-EF) 10yyyyyy 10zzzzzz第一個(gè)字節(jié)由1110開始,接著的字節(jié)由10開始
    四個(gè)x;四個(gè)y;二個(gè)y;六個(gè)z四個(gè)x;六個(gè)y;六個(gè)z
    010000 – 10FFFF
    1048576個(gè)代碼
    000wwwxx xxxxyyyy yyzzzzzz11110www(F0-F7) 10xxxxxx 10yyyyyy 10zzzzzz將由11110開始,接著的字節(jié)由10開始
    三個(gè)w;二個(gè)x;四個(gè)x;四個(gè)y;二個(gè)y;六個(gè)z三個(gè)w;六個(gè)x;六個(gè)y;六個(gè)z

    UTF-8優(yōu)缺點(diǎn)

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

  • 保證搜索時(shí)一個(gè)字符的字符串不會(huì)出現(xiàn)在另一個(gè)字符的串里面.
  • 兼容ASCII
  • 抗干擾和穩(wěn)定性好:一段兩字節(jié)隨機(jī)串行碰巧為合法的UTF-8而非ASCII的機(jī)率為32分1。對(duì)于三字節(jié)串行的機(jī)率為256分1,對(duì)更長的串行的機(jī)率就更低了
  • 缺點(diǎn)

  • 與UTF-16/gbk 想比,處理CJK字符串,編碼長度不占優(yōu)勢(shì)
  • UTF-8正則匹配

    當(dāng)使用Perl時(shí),可用以下的表達(dá)式測(cè)試頁面是否使用了UTF-8編碼:

    m/\A([\x09\x0A\x0D\x20-\x7E] # ASCII| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 )*\z/x;

    utf8_unicode_ci和utf8_general_ci區(qū)別

    utf8_unicode_ci的最主要的特色是支持?jǐn)U展,即當(dāng)把一個(gè)字母看作與其它字母組合相等時(shí)。例如,在德語和一些其它語言中‘?’等于‘ss’。

    utf8_general_ci是一個(gè)遺留的 校對(duì)規(guī)則,不支持?jǐn)U展。它僅能夠在字符之間進(jìn)行逐個(gè)比較。這意味著utf8_general_ci校對(duì)規(guī)則進(jìn)行的比較速度很快,但是與使用utf8_unicode_ci的校對(duì)規(guī)則相比,比較正確性較差)。

    其它UTF

    UTF-7

    UTF-7是一種可變長度的字符編碼方式,用以將UTF-16字符以ASCII編碼.也就是說用修改的Base64(Modified Base64)去編碼UTF-16字符.

    因?yàn)镾MTP作為基本郵件傳輸標(biāo)準(zhǔn),只允許傳輸ASCII字符,過去很多郵件傳輸都使用UTF-7.自從MIME擴(kuò)展了電子郵件標(biāo)準(zhǔn)之后,SMTP支持了其它字符集.現(xiàn)在絕大多數(shù)郵件服務(wù)商都使用UTF-8/GB2312/GB18030作為郵件字符編碼.

    嚴(yán)格來說 UTF-7 不能算是 Unicode 所定義的字符集之一,較精確的來說, UTF-7 是提供了一種將 Unicode 轉(zhuǎn)換為 7 比特 US-ASCII 字符的轉(zhuǎn)換方式
    Modified Base64 與Base64的主要區(qū)別是結(jié)尾不會(huì)有”=”

    UTF-7由于安全性薄弱,已經(jīng)走入歷史.

    Gmail中文用戶默認(rèn)外發(fā)郵件編碼(content-type)是GB2312(可改為UTF-8).其傳輸編碼(Content-Transfer-Encoding)會(huì)按數(shù)據(jù)最短的原則選擇: quoted-printable/base64或者不用.
    騰訊郵箱用戶默認(rèn)的外發(fā)郵件編碼是gb18030(可改為UTF-8).其傳輸編碼使用的是base64.

    UTF-32

    UTF-32 是一個(gè) UCS-4 的子集,使用32-比特的碼值,只在0到10FFFF的字碼空間(百萬個(gè)碼位)

    內(nèi)容傳輸編碼(Content-Transfer-Encoding)

    CTE由MIME定義,用于email數(shù)據(jù)傳輸.包括“7bit”,“8bit”,“binary”,“quoted-printable”,“base64”.其中常見的傳輸碼為Base64/quoted-printable

    Base64

    Base64不是字符編碼方案,而是一種基于64個(gè)可打印字符來表示二進(jìn)制數(shù)據(jù)的表示方法.6bit(2^6=64)為一單元,對(duì)應(yīng)一個(gè)可打印的字符.三個(gè)字節(jié)有24個(gè)位元.對(duì)應(yīng)4個(gè)Base64字符.

    編碼規(guī)則

    將二進(jìn)制流/文本流以每6bit為一單元,3個(gè)字節(jié)為一組.以6bit(2^6=64)的數(shù)字大小為位置對(duì)應(yīng)以下字符中的一個(gè):

    ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

    如果最后剩余2個(gè)或1個(gè)字節(jié),按以下方式補(bǔ)0:

    文本ASCII編碼二進(jìn)制位索引Base64編碼
    Man
    7797110
    010011010110000101101110
    1922546
    TWFu

    最后,如果剩下兩個(gè)字節(jié),在編碼結(jié)果后加1個(gè)“=”;如果最后剩下一個(gè)字節(jié),編碼結(jié)果后加2個(gè)“=”;如果沒有剩下任何數(shù)據(jù),就什么都不要加,這樣才可以保證資料還原的正確性。

    Quoted-printable

    可打印字符引用編碼(Quoted-printable,或QP encoding).
    它使用ASCII字符表示各種字符編碼–以便能個(gè)7bit or 8bit 數(shù)據(jù)通路上傳輸數(shù)據(jù).
    此編碼為是MIME中 content transfer encoding的一種,用于email.(與base64并列為兩種基本的郵件傳輸編碼)

    編碼規(guī)則

    Quoted-printable以8bit為單位進(jìn)行編碼,規(guī)則如下:

    一般的8bit編碼為"="加兩個(gè)十六進(jìn)制值,如"\x7A"編碼為"=7A" 對(duì)于可打印的ascii碼:0x21-0x7E("="號(hào):0x3D除外),可用ASCII碼直接表示 但是,如果水平制表符和空格符出現(xiàn)在行尾,必須用OP編碼表示為"=09"(tab)和"=20"(space) 如果QP編碼的數(shù)據(jù)每行長度超過76個(gè)字符,QP編碼結(jié)果的每行結(jié)尾加一個(gè)軟換行("=")

    Gmail在發(fā)送以下字符時(shí)所使用的Content-Transfer-Econding正是QP,如果將其ContentType設(shè)置為:UTF-8.并發(fā)送郵件內(nèi)容(“新”的utf8編碼為\xe696b0):

    新This is a test! If you believe that truth=beauty, then surely mathematics is the most beautiful branch of philosophy.

    那么,經(jīng)過QP編碼后的郵件text/plain原文為:

    =E6=96=B0This is a test! If you believe that truth=3Dbeauty, then surely mathematics is the most bea= utiful branch of philosophy.

    你很可能看到的是這個(gè)(因?yàn)槟愕泥]件文本編輯器做format字符時(shí)就在most處斷行了,使得單行不超過76個(gè)字符):

    =E6=96=B0This is a test! If you believe that truth=3Dbeauty, then surely mathematics is the most beautiful branch of philosophy.

    還有一個(gè)text/html原文.

    與base64相比,如果Content-Type編碼與ASCII是兼容的,那么QP編碼后的郵件原文中ASCII是可讀的.

    GB相關(guān)的編碼

    本小節(jié)主要?dú)w納漢字相關(guān)的編碼:GB2312,GBK,GB18030.他們的關(guān)系如下圖:

    如圖所示,GB18030基本兼容GBK.

    GB2312

    GB2312,也叫GB2312-80,于1981年推出.

    特點(diǎn)

  • 收錄6763個(gè)漢字
  • 編碼結(jié)構(gòu)

    先對(duì)漢字進(jìn)行分區(qū)(得到的編碼叫區(qū)位碼).

  • 01-09區(qū)為特殊符號(hào)。
  • 16-55區(qū)為一級(jí)漢字,按拼音排序。
  • 56-87區(qū)為二級(jí)漢字,按部首/筆畫排序。
  • 編碼:
    對(duì)于ascii(0×00-0x7f)保持不變.
    對(duì)于漢字和符號(hào),使用兩個(gè)字節(jié)表示:“高位字節(jié)”使用了0xA1-0xF7(把01-87區(qū)的區(qū)號(hào)加上0xA0),“低位字節(jié)”使用了0xA1-0xFE(把01-94加上0xA0)

    “啊”的區(qū)位碼是0×1001,對(duì)應(yīng)的gb2312就是0xb0a1

    GBK

    背景

    因?yàn)樵璆B2312字符不足, 廠商微軟利用GB 2312-80未使用的編碼空間,收錄GB 13000.1-93全部字符制定了GBK編碼.

    編碼結(jié)構(gòu)

    對(duì)于GB2312字符保持不變,僅對(duì)Gb2312未使用的編碼區(qū)進(jìn)行了擴(kuò)充.
    對(duì)于雙字節(jié)來說:第一字節(jié)的范圍是81–FE(也就是不含80和FF),第二字節(jié)的一部分領(lǐng)域在40–7E,其他領(lǐng)域在80–FE.

    GBK的編碼范圍范圍第1字節(jié)第2字節(jié)編碼數(shù)字?jǐn)?shù)合計(jì):??23,94021,886
    水準(zhǔn) GBK/1A1–A9A1–FE846717
    水準(zhǔn) GBK/2B0–F7A1–FE6,7686,763
    水準(zhǔn) GBK/381–A040–FE (7F除外)6,0806,080
    水準(zhǔn) GBK/4AA–FE40–A0 (7F除外)8,1608,160
    水準(zhǔn) GBK/5A8–A940–A0 (7F除外)192166
    用戶定義AA–AFA1–FE564?
    用戶定義F8–FEA1–FE658?
    用戶定義A1–A740–A0 (7F除外)672?

    按拼音排序

    基于Gbk/Gb2312是按音序來編碼的.可用此規(guī)則來對(duì)漢字進(jìn)行拼音排序(以php為例)

    //按拼音首字母排序 $arr = array('北京'=>'010','成都'=>'028', ); ukrsort($arr, 'cmp'); var_dump($arr);/**** 比較拼音首字母(基于字符是按拼音順序編碼)*/ function cmp(&$a, &$b) {$a = iconv('utf-8', 'gbk', $a);$a = $a[0];$b = iconv('utf-8', 'gbk', $b);$b = $b[0];if ($a == $b) {return 0;}return ($a > $b) ? 1 : -1; } function ukrsort(&$arr, $func) {foreach ($arr as $k => $v) {if (is_array($arr[$k])) {ukrsort($arr[$k], $func);}}uksort($arr, $func); }

    也可以通過編碼找到絕大部分漢字的拼音首字母(以php為例)

    /*** 獲取漢字拼音首字母(基于字符是按拼音順序編碼)*/ function getFirstLetter($str) {$fchar = ord($str{0});if ($fchar >= ord("A") and $fchar <= ord("z"))return strtoupper($str{0});if (!is_string($str)) {var_dump($str);return;}$s1 = @iconv("UTF-8", "gbk", $str);$s2 = @iconv("gbk", "UTF-8", $s1);if ($s2 == $str) {$s = $s1;} else {$s = $str;}$asc = ord($s{0}) * 256 + ord($s{1}) ;if ($asc >= 45217 and $asc <= 45252)return "A";if ($asc >= 45253 and $asc <= 45760)return "B";if ($asc >= 45761 and $asc <= 46317)return "C";if ($asc >= 46318 and $asc <= 46825)return "D";if ($asc >= 46826 and $asc <= 47009)return "E";if ($asc >= 47010 and $asc <= 47296)return "F";if ($asc >= 47297 and $asc <= 47613)return "G";if ($asc >= 47614 and $asc <= 48118)return "I";if ($asc >= 48119 and $asc <= 49061)return "J";if ($asc >= 49062 and $asc <= 49323)return "K";if ($asc >= 49324 and $asc <= 49895)return "L";if ($asc >= 49896 and $asc <= 50370)return "M";if ($asc >= 50371 and $asc <= 50613)return "N";if ($asc >= 50614 and $asc <= 50621)return "O";if ($asc >= 50622 and $asc <= 50905)return "P";if ($asc >= 50906 and $asc <= 51386)return "Q";if ($asc >= 51387 and $asc <= 51445)return "R";if ($asc >= 51446 and $asc <= 52217)return "S";if ($asc >= 52218 and $asc <= 52697)return "T";if ($asc >= 52698 and $asc <= 52979)return "W";if ($asc >= 52980 and $asc <= 53688)return "X";if ($asc >= 53689 and $asc <= 54480)return "Y";if ($asc >= 54481 and $asc <= 55289)return "Z";return null; }

    GB18030

    GB 18030,全稱:國家標(biāo)準(zhǔn)GB 18030-2005《信息技術(shù) 中文編碼字符集》,是中華人民共和國現(xiàn)時(shí)最新的內(nèi)碼字集(2005年發(fā)布).
    有以下特點(diǎn):

    采用多字節(jié)編碼,每個(gè)字可以由1個(gè)、2個(gè)或4個(gè)字節(jié)組成。
    支持全部unicode(UCS)全部統(tǒng)一漢字.收錄范圍包含繁體漢字以及日韓漢字70244個(gè)
    與GBK基本兼容,與GB 2312完全兼容

    編碼結(jié)構(gòu)

  • 單字節(jié),其值從0到0x7F。
  • 雙字節(jié),第一個(gè)字節(jié)的值從0×81到0xFE,第二個(gè)字節(jié)的值從0×40到0xFE(不包括0x7F)。
  • 四字節(jié),第一/三字節(jié)的值從0×81到0xFE,第二/四字節(jié)的值從0×30到0×39.
  • 正則匹配

    '#[\x00-\x7f]|[\x81-\xfe][\x40-0xfe]|([\x81-0xfe][\x30-\x39]){2}#'

    參考

  • 維基UCS
  • 維基字符平面映射
  • utf_bom
  • 維基unicode
  • 維基現(xiàn)代編碼模型
  • 維基UTF-16
  • 維基UTF-8
  • 維基GB2312
  • 維基GBK
  • 維基GB18030
  • ?

    總結(jié)

    以上是生活随笔為你收集整理的(个人理解+转载)ANSI/ASCII/UTF8/UNICODE/GB2312/UCS-2/UTF16-文本的编码格式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。