1,、ANSI編碼
unicode和ansi都是字符代碼的一種表示形式,。
為使計(jì)算機(jī)支持更多語(yǔ)言,通常使用 0x80~0xFF 范圍的 2 個(gè)字節(jié)來(lái)表示 1 個(gè)字符,。比如:漢字 '中' 在中文操作系統(tǒng)中,,使用 [0xD6,0xD0] 這兩個(gè)字節(jié)存儲(chǔ)。
不同的國(guó)家和地區(qū)制定了不同的標(biāo)準(zhǔn),,由此產(chǎn)生了 GB2312, BIG5, JIS 等各自的編碼標(biāo)準(zhǔn),。這些使用
2 個(gè)字節(jié)來(lái)代表一個(gè)字符的各種漢字延伸編碼方式,稱(chēng)為 ANSI 編碼,。在簡(jiǎn)體中文系統(tǒng)下,,ANSI 編碼代表 GB2312
編碼,在日文操作系統(tǒng)下,,ANSI 編碼代表 JIS 編碼,。
不同 ANSI 編碼之間互不兼容,當(dāng)信息在國(guó)際間交流時(shí),,無(wú)法將屬于兩種語(yǔ)言的文字,,存儲(chǔ)在同一段 ANSI 編碼的文本中。
ANSI編碼表示英文字符時(shí)用一個(gè)字節(jié),,表示中文用兩個(gè)字節(jié),,而unicode不管表示英文字符還是中文都是用兩個(gè)字節(jié)來(lái)表示。
2,、ASCII 計(jì)算機(jī)內(nèi)部的數(shù)據(jù)最終以二進(jìn)制形式存放,,每個(gè)二進(jìn)制位(bit)有0和1兩種狀態(tài),而8個(gè)二進(jìn)制位(bit)組合稱(chēng)為一個(gè)字節(jié)(Byte),,所以一個(gè)字節(jié)能夠組合出256中狀態(tài),,即從00000000到11111111。 上世紀(jì)70年代,,美國(guó)國(guó)度標(biāo)準(zhǔn)協(xié)會(huì)(American National Standard Institute , ANSI )制訂了ASCII碼(American Standard Code for Information Interchange,,美國(guó)標(biāo)準(zhǔn)信息交換碼):使用7 位二進(jìn)制數(shù)共128個(gè)組合來(lái)表示所有的大寫(xiě)和小寫(xiě)字母,數(shù)字0 到9,、標(biāo)點(diǎn)符號(hào),, 以及在美式英語(yǔ)中使用的特殊控制字符。 第0~32號(hào)及第127號(hào)(共34個(gè))是控制字符或通訊專(zhuān)用字符,,如控制符:LF(換行),、CR(回車(chē)),、FF(換頁(yè))、DEL(刪除),、BEL(振鈴)等,; 第33~126號(hào)(共94個(gè))是字符,其中第48~57號(hào)為0~9十個(gè)阿拉伯?dāng)?shù)字,;65~90號(hào)為26個(gè)大寫(xiě)英文字母,,97~122號(hào)為26個(gè)小寫(xiě)英文字母,其余為一些標(biāo)點(diǎn)符號(hào),、運(yùn)算符號(hào)等,。 PS:在計(jì)算機(jī)的存儲(chǔ)單元中,一個(gè)ASCII碼值占一個(gè)字節(jié)(8個(gè)二進(jìn)制位),,其最高位(b7)用作奇偶校驗(yàn)位,。所謂奇偶校驗(yàn),是指在代碼傳送過(guò)程中用來(lái)檢驗(yàn)是否出現(xiàn)錯(cuò)誤的一種方法,,一般分奇校驗(yàn)和偶校驗(yàn)兩種,。奇校驗(yàn)規(guī)定:正確的代碼一個(gè)字節(jié)中1的個(gè)數(shù)必須是奇數(shù),若非奇數(shù),,則在最高位b7添1,;偶校驗(yàn)規(guī)定:正確的代碼一個(gè)字節(jié)中1的個(gè)數(shù)必須是偶數(shù),若非偶數(shù),,則在最高位b7添1,。
一個(gè)字節(jié)中的后7位總共只能表示128個(gè)不同的字符,,英語(yǔ)用這些字符已經(jīng)足夠了,,可是要表示其他語(yǔ)言卻是不夠。比如,,在法語(yǔ)中,,字母上方有注音的符號(hào),就無(wú)法用ASCII表示,。于是,,一些國(guó)家就利用了字節(jié)中閑置的最高位編入新的符號(hào)。這樣一來(lái),,就可以表示最多256個(gè)符號(hào),,這就是擴(kuò)展的ASCII 碼,所以現(xiàn)在有7位和8位的兩種ASCII碼,,擴(kuò)展的ASCII 碼允許將每個(gè)字符的第8 位用于確定附加的128 個(gè)特殊符號(hào)字符,、外來(lái)語(yǔ)字母和圖形符號(hào)。但是,,不管怎樣,,0~127表示的字符是一樣的,,不同的只是128~255. PS:查詢(xún)后128個(gè)ASCII對(duì)應(yīng)字符的技巧:新建一個(gè)文本文檔,按住ALT+要查詢(xún)的碼值(注意,,這里是十進(jìn)制) ,,松開(kāi)即可顯示出對(duì)應(yīng)字符。 但即使擴(kuò)展到256個(gè)符號(hào)也不夠用,,比如漢字據(jù)統(tǒng)計(jì)有10萬(wàn)個(gè)以上,,而且同一個(gè)數(shù)值在各國(guó)的語(yǔ)言中表示的卻不同,比如130在法語(yǔ)里面é,,而在希臘語(yǔ)里面則代表Gimel。于是UNICODE應(yīng)運(yùn)而生,。 Unicode字符集編碼是Universal Multiple-Octet Coded Character Set 通用多八位編碼字符集的簡(jiǎn)稱(chēng),,是國(guó)際組織制定的可以容納世界上所有文字和符號(hào)的字符編碼方案。 Unicode是一種在計(jì)算機(jī)上使用的字符編碼,。它為每種語(yǔ)言中的每個(gè)字符設(shè)定了統(tǒng)一并且唯一的二進(jìn)制編碼,,以滿(mǎn)足跨語(yǔ)言、跨平臺(tái)進(jìn)行文本轉(zhuǎn)換,、處理的要求,。Unicode 標(biāo)準(zhǔn)始終使用十六進(jìn)制數(shù)字,而且在書(shū)寫(xiě)時(shí)在前面加上前綴“U+”,,例如字母“A”的編碼為 004116 和字符“?”的編碼為 20AC16,。所以“A”的編碼書(shū)寫(xiě)為“U+0041”。但Unicode只是一個(gè)符號(hào)集,,它只規(guī)定了符號(hào)的二進(jìn)制代碼,,卻沒(méi)有規(guī)定這個(gè)二進(jìn)制代碼應(yīng)該如何存儲(chǔ)。
事實(shí)證明,,對(duì)可以用ASCII表示的字符使用UNICODE并不高效,因?yàn)閁NICODE比ASCII占用大一倍的空間,,而對(duì)ASCII來(lái)說(shuō)高字節(jié)的0對(duì) 他毫無(wú)用處,。為了解決這個(gè)問(wèn)題,就出現(xiàn)了一些中間格式的字符集,,他們被稱(chēng)為通用轉(zhuǎn)換格式,,即UTF(Universal Transformation Format)。目前存在的UTF格式有:UTF-7, UTF-7.5, UTF-8, UTF-16, 以及 UTF-32,。 UTF-8(8-bit Unicode Transformation Format)是一種針對(duì)Unicode的可變長(zhǎng)度字符編碼(定長(zhǎng)碼),,也是一種前綴碼。它可以用來(lái)表示Unicode標(biāo)準(zhǔn)中的任何字符,,且其編碼中的第 一個(gè)字節(jié)仍與ASCII兼容,,這使得原來(lái)處理ASCII字符的軟件無(wú)須或只須做少部份修改,,即可繼續(xù)使用。因此,,它逐漸成為電子郵件,、網(wǎng)頁(yè)及其他存儲(chǔ)或傳 送文字的應(yīng)用中,優(yōu)先采用的編碼,。 UTF-8用1~4個(gè)字節(jié)對(duì)Unicode進(jìn)行編碼,。從Unicode到UTF-8的編碼方式如下: 000000 - 00007F║0xxxxxxx 對(duì)于0x00-0x7F之間的字符,UTF-8編碼與ASCII編碼完全相同,; 帶有附加符號(hào)的拉丁文,、希臘文、西里爾字母,、亞美尼亞語(yǔ),、希伯來(lái)文、阿拉伯文,、敘利亞文及它拿字母則需要二個(gè)字節(jié)編碼(Unicode范圍由),; 其他基本多文種平面(BMP)中的字符(這包含了大部分常用字)使用三個(gè)字節(jié)編碼; 其他極少使用的Unicode 輔助平面的字符使用四字節(jié)編碼,; UTF-8編碼的最大長(zhǎng)度是4個(gè)字節(jié),。從上表可以看出,4字節(jié)模板有21個(gè)x,,即可以容納21位二進(jìn)制數(shù)字,。Unicode的最大碼位0x10FFFF也只有21位。
如果字節(jié)(Byte)的第一位為0,,則B為ASCII碼,,并且Byte獨(dú)立的表示一個(gè)字符; 如果字節(jié)(Byte)的第一位為1,第二位為0,,則Byte為一個(gè)非ASCII字符(該字符由多個(gè)字節(jié)表示)中的一個(gè)字節(jié),,并且不為字符的第一個(gè)字節(jié)編碼; 如果字節(jié)(Byte)的前兩位為1,第三位為0,,則Byte為一個(gè)非ASCII字符(該字符由多個(gè)字節(jié)表示)中的第一個(gè)字節(jié),,并且該字符由兩個(gè)字節(jié)表示; 如果字節(jié)(Byte)的前三位為1,第四位為0,,則Byte為一個(gè)非ASCII字符(該字符由多個(gè)字節(jié)表示)中的第一個(gè)字節(jié),,并且該字符由三個(gè)字節(jié)表示; 如果字節(jié)(Byte)的前四位為1,第五位為0,,則Byte為一個(gè)非ASCII字符(該字符由多個(gè)字節(jié)表示)中的第一個(gè)字節(jié),,并且該字符由四個(gè)字節(jié)表示 |
|
來(lái)自: 昵稱(chēng)15242507 > 《Java》