計(jì)算機(jī)是如何表示字符的星虹?
計(jì)算中的數(shù)據(jù)都是二進(jìn)制(0和1)驱富,用一位來(lái)存儲(chǔ)1個(gè)0或1革屠,稱為bit凿试。
8個(gè)二進(jìn)制序列(8個(gè)bit)為一個(gè)字節(jié)(byte)。
一個(gè)字節(jié)為現(xiàn)代計(jì)算機(jī)計(jì)算的最小單位似芝。
計(jì)算機(jī)通過(guò)不同的2進(jìn)制序列來(lái)表示不同的字符那婉。如:
01100001='A'
00110000='0'
01000000='@'
1100111011010010='我'
1100111011010010 1011000010101110 1100010011100011="我愛(ài)你"
二進(jìn)制序列可以計(jì)算為一個(gè)數(shù)字,比如:二進(jìn)制序列(00000101)等于十進(jìn)制數(shù)值5
所以也可以理解為計(jì)算機(jī)通過(guò)不同的整數(shù)來(lái)表示不同的字符
01100001=65='A'
00110000=48='0'
01000000=64='@'
1100111011010010=52946='我'
數(shù)字用其他進(jìn)制表示比較長(zhǎng)党瓮,所以一般用16進(jìn)制來(lái)表示详炬。
0x41='A'
0x30='0'
0x40='@'
0xCED2='我'
0xCED2 0xB0AE 0xC4E3="我愛(ài)你"
字符集和字符編碼的相關(guān)概念
字符
: 是各種文字和符號(hào)的總稱,包括各國(guó)家文字寞奸、標(biāo)點(diǎn)符號(hào)痕寓、圖形符號(hào)、數(shù)字等蝇闭。
字符表
: 是一個(gè)系統(tǒng)支持的所有字符的集合呻率。
字符集
: 又稱為編碼字符集,是一個(gè)包含字符表中每一個(gè)字符和對(duì)應(yīng)的整數(shù)映射關(guān)系的集合呻引。
碼位值
: 一個(gè)字符在某個(gè)字符集中的映射的值礼仗,一般是一個(gè)整數(shù)。
字符編碼
: 是把一個(gè)碼位值轉(zhuǎn)換為用于存儲(chǔ)和傳輸?shù)?進(jìn)制序列的方式逻悠。
上面這幾個(gè)概念如下圖所示:
常見(jiàn)的字符集
由于不同的國(guó)家和地區(qū)使用不同的文字元践,就衍生出了很多不同的字符集和不同的字符編碼方案。如:
- 用于現(xiàn)代英語(yǔ)的ASCII字符集
- 用于歐洲很多國(guó)家的iso8859系列字符集
- 用于中國(guó)的GB2312童谒,GBk单旁,GB18030等字符集
- 用于臺(tái)灣,香港饥伊,澳門(mén)等的Big5字符集象浑。
- 用于日本的Shift JIS字符集
- 用于越南的VISCII
- 用于印度的ISCII
- 包含全世界所有文字符號(hào)的Unicode字符集和其UTF-7蔫饰,UTF-8,UTF-16等字符編碼方案愉豺。
ASCII(ascii)字符集&字符編碼
ASCII
: American Standard Code for Information Interchange篓吁,美國(guó)信息交換標(biāo)準(zhǔn)代碼,是基于拉丁字母的一套電腦編碼系統(tǒng)。主要用于顯示現(xiàn)代英語(yǔ)蚪拦,而其擴(kuò)展版本EASCII則可以勉強(qiáng)顯示其他西歐語(yǔ)言杖剪。它是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng)(但是有被Unicode追上的跡象),并等同于國(guó)際標(biāo)準(zhǔn)ISO/IEC 646驰贷。
編碼字符集
: 共定義了128個(gè)字符,包括95個(gè)可顯示字符(大小寫(xiě)字母盛嘿,阿拉伯?dāng)?shù)字?jǐn)?shù)字,標(biāo)點(diǎn)符號(hào)等)和33個(gè)控制字符(回車(chē)鍵括袒、退格孩擂、換行鍵等)
常見(jiàn)編碼方式
: 7位2進(jìn)制就可表示128中狀態(tài),就可以表示128個(gè)字符箱熬,但計(jì)算機(jī)最小處理單位為8位类垦,每個(gè)ascii字符用8位表示。首位補(bǔ)充為0.
ISO8859系列字符集和字符編碼
計(jì)算機(jī)從美國(guó)發(fā)展到了歐洲城须。歐洲很多國(guó)家所用到的字符中蚤认,除了美國(guó)的128個(gè)ASCII字符之外,還有很多衍生的拉丁字母等字符糕伐。如在法語(yǔ)中砰琢,字母上方有注音符中(éé) (èè)(êê)(??)
;而歐洲其他國(guó)家也有各自特有的字符良瞧。
一個(gè)字節(jié)能夠表示的字符可以有256個(gè),而ASCII只使用了一個(gè)字節(jié)所能表示的256個(gè)編碼中的前128個(gè)陪汽,而后128個(gè)編碼相當(dāng)于被閑置了。因此褥蚯,歐洲各國(guó)紛紛打起了后面這128個(gè)編碼的主意,導(dǎo)致歐洲各國(guó)各語(yǔ)言的單獨(dú)編碼的混亂局面挚冤。
編碼字符集
: 為了解決各國(guó)各語(yǔ)言的單獨(dú)編碼的混亂局面,國(guó)際標(biāo)準(zhǔn)化組織(ISO)及國(guó)際電工委員會(huì)(IEC)聯(lián)合制定的一系列8位元字符集的標(biāo)準(zhǔn)赞庶,現(xiàn)時(shí)定義了15個(gè)字符集.
- ISO/IEC 8859-1 (Latin-1) - 西歐語(yǔ)言
- ISO/IEC 8859-2 (Latin-2) - 中歐語(yǔ)言
- ISO/IEC 8859-3 (Latin-3) - 南歐語(yǔ)言训挡。世界語(yǔ)也可用此字符集顯示。
- ISO/IEC 8859-4 (Latin-4) - 北歐語(yǔ)言
- ISO/IEC 8859-5 (Cyrillic) - 斯拉夫語(yǔ)言
- ISO/IEC 8859-6 (Arabic) - 阿拉伯語(yǔ)
- ISO/IEC 8859-7 (Greek) - 希臘語(yǔ)
- ISO/IEC 8859-8 (Hebrew) - 希伯來(lái)語(yǔ)(視覺(jué)順序)
- ISO/IEC 8859-8-I - 希伯來(lái)語(yǔ)(邏輯順序)
- ISO/IEC 8859-9(Latin-5 或 Turkish)土耳其語(yǔ)歧强。
- ISO/IEC 8859-10(Latin-6 或 Nordic)-北日耳曼語(yǔ)支
- ISO/IEC 8859-11 (Thai) - 泰語(yǔ)
- ISO/IEC 8859-12 印度天城體梵文(擱置)
- ISO/IEC 8859-13(Latin-7 或 Baltic Rim)- 波羅的語(yǔ)族
- ISO/IEC 8859-14(Latin-8 或 Celtic)- 凱爾特語(yǔ)族
- ISO/IEC 8859-15 (Latin-9)西歐語(yǔ)言澜薄,
加入Latin-1欠缺的芬蘭語(yǔ)字母和大寫(xiě)法語(yǔ)重音字母,以及歐元(€)符號(hào)
- ISO/IEC 8859-16 (Latin-10) - 羅馬尼亞語(yǔ)使用摊册,并加入歐元符號(hào)
編碼方式
: 剛好8位肤京,直接編碼即可。
中國(guó)GB系列字符集和字符編碼
常見(jiàn)的中國(guó)字符集有:
- GB2312
- GBK
- GB18030
GB2312編碼字符集
當(dāng)計(jì)算機(jī)引入中國(guó)后茅特,為了顯示中文忘分,必須重新設(shè)計(jì)一套字符集(很明顯棋枕,中國(guó)漢字遠(yuǎn)遠(yuǎn)超過(guò)128個(gè))。
新的字符集在1981年由中國(guó)國(guó)家標(biāo)準(zhǔn)總局發(fā)布饭庞,取名為GB2312或GB2312-80。全稱為《信息交換用漢字編碼字符集·基本集》熬荆。
只收錄6763個(gè)漢字舟山,有不少漢字,如"啰"卤恳,"镕"以及臺(tái)灣及香港使用的繁體字累盗,日語(yǔ)及朝鮮語(yǔ)漢字等,并未有收錄在內(nèi)突琳。
GB2312中對(duì)所收漢字進(jìn)行了“分區(qū)”處理若债,每區(qū)含有94個(gè)字符,共計(jì)94個(gè)區(qū)拆融。即最多可表示94*94(8836個(gè)符號(hào))
用所在的區(qū)和位來(lái)表示字符蠢琳,例如“萬(wàn)”字在45區(qū)82位,所以“萬(wàn)”字的區(qū)位碼是:4582镜豹。
分區(qū)如下:
- 01~09區(qū)(682個(gè)):特殊符號(hào)傲须、數(shù)字、英文字符趟脂、制表符等泰讽,包括拉丁字母、希臘字母昔期、日文平假名及片假名字母已卸、俄語(yǔ)西里爾字母等在內(nèi)的682個(gè)全角字符;
- 10~15區(qū):空區(qū)硼一,留待擴(kuò)展蟹演;在附錄3妙同,第10區(qū)推薦作為 GB 1988–80 中的94個(gè)圖形字符區(qū)域(即第3區(qū)字符之半形版本)。
- 16~55區(qū)(3755個(gè)):常用漢字(也稱一級(jí)漢字),按拼音排序镣奋;
- 56~87區(qū)(3008個(gè)):非常用漢字(也稱二級(jí)漢字),按部首/筆畫(huà)排序钞脂;
- 88~94區(qū):空區(qū)纵散,留待擴(kuò)展。
GB2312編碼方式
為了兼容ASCII字符集人芽,GB2312規(guī)定一個(gè)小于127的字符的意義與原來(lái)相同望几。
但兩個(gè)大于127的字符連在一起時(shí),就表示一個(gè)GB2312字符萤厅。
每個(gè)字符以兩個(gè)字節(jié)來(lái)表示橄抹。第一個(gè)字節(jié)稱為“高位字節(jié)”靴迫,第二個(gè)字節(jié)稱為“低位字節(jié)”÷ナ模“高位字節(jié)”使用了0xA1–0xF7(把01–87區(qū)的區(qū)號(hào)加上0xA0)玉锌,“低位字節(jié)”使用了0xA1–0xFE(把01–94加上0xA0)。
中文的半角和全角
在GB2312中除了包含常用中文字符外疟羹,還把數(shù)學(xué)符號(hào)主守、羅馬希臘字母、日文的片假名等都編進(jìn)去了榄融,連在ASCII里本來(lái)就有的數(shù)字参淫、標(biāo)點(diǎn)、字母都統(tǒng)統(tǒng)重新編了兩個(gè)字節(jié)長(zhǎng)的編碼愧杯,這就是常說(shuō)的"全角"字符涎才,而原來(lái)在ASCII中的那些符號(hào)就叫"半角"字符了。
GBK編碼字符集
GB2312的出現(xiàn)力九,基本滿足了漢字的計(jì)算機(jī)處理需要耍铜,它所收錄的漢字已經(jīng)覆蓋中國(guó)大陸99.75%的使用頻率。但對(duì)于人名跌前、古漢語(yǔ)等方面出現(xiàn)的罕用字和繁體字业扒,GB2312不能處理,于是微軟利用GB2312未使用的編碼空間舒萎,對(duì)其進(jìn)行擴(kuò)展形成了GBK編碼程储。共收錄21886個(gè)漢字和圖形符號(hào),其中漢字(包括部首和構(gòu)件)21003個(gè)臂寝,圖形符號(hào)883個(gè)章鲤。
GBK向下完全兼容GB2312-80編碼。支持GB2312-80編碼不支持的部分中文姓,中文繁體,日文假名,還包括希臘字母以及俄語(yǔ)字母等字母。
GBK編碼方式
字符有一字節(jié)和雙字節(jié)編碼,00–7F范圍內(nèi)是第一個(gè)字節(jié)坦报,和ASCII保持一致
之后的雙字節(jié)中,前一字節(jié)是雙字節(jié)的第一位。總體上說(shuō)第一字節(jié)的范圍是81–FE(也就是不含80和FF)歇由,第二字節(jié)的一部分領(lǐng)域在40–7E谢谦,其他領(lǐng)域在80–FE没咙。
GB18030編碼字符集
但GBK自身并非國(guó)家標(biāo)準(zhǔn)袁梗,所以由國(guó)家質(zhì)量技術(shù)監(jiān)督局于2000年3月17日發(fā)布了最新的字符集,稱之為GB18030陌凳,全稱為國(guó)家標(biāo)準(zhǔn)GB 18030-2005《信息技術(shù) 中文編碼字符集》初橘。
共收錄漢字70244個(gè),與GB2312完全兼容充岛,與GBK基本兼容保檐。
GB 18030主要有以下特點(diǎn):
- 采用變長(zhǎng)多字節(jié)編碼,每個(gè)字可以由1個(gè)崔梗、2個(gè)或4個(gè)字節(jié)組成夜只。
- 編碼空間龐大,最多可定義161萬(wàn)個(gè)字符蒜魄。
- 支持中國(guó)國(guó)內(nèi)少數(shù)民族文字扔亥,不需要?jiǎng)佑迷熳謪^(qū)。
- 漢字收錄范圍包含繁體漢字以及日韓漢字谈为。
GB18030編碼方式
GB18030包含三種長(zhǎng)度的編碼:?jiǎn)巫止?jié)的ASCII旅挤、雙字節(jié)的GBK(略帶擴(kuò)展)、以及用于填補(bǔ)所有Unicode碼位的四字節(jié)UTF區(qū)段峦阁。GBK雙字節(jié)部分通過(guò)查表定義谦铃,而四字節(jié)部分則根據(jù)之前兩個(gè)部分沒(méi)有提到的通用字符集碼位順序填補(bǔ)。由于和GBK兼容榔昔,GB 18030在搜索ASCII字符時(shí)也需要使用特別代碼進(jìn)行判斷驹闰。
大五碼(Big5)字符集和字符編碼
“大五碼”(Big5)是由臺(tái)灣財(cái)團(tuán)法人信息產(chǎn)業(yè)策進(jìn)會(huì)為五大中文套裝軟件所設(shè)計(jì)的中文共通內(nèi)碼,在1983年12月完成撒会。除了臺(tái)灣外嘹朗,其他使用繁體漢字的地區(qū),如香港(香港增補(bǔ)字符集)诵肛、澳門(mén)(澳門(mén)增補(bǔ)字符集)屹培,及使用繁體漢字的海外華人默穴,都曾普遍使用Big5碼做為中文內(nèi)碼及交換碼。
編碼字符集和編碼方案
Big5碼是一套雙字節(jié)字符集褪秀,共收錄13,060個(gè)漢字蓄诽,使用了雙八碼存儲(chǔ)方法,以兩個(gè)字節(jié)來(lái)安放一個(gè)字媒吗。第一個(gè)字節(jié)稱為“高位字節(jié)”仑氛,第二個(gè)字節(jié)稱為“低位字節(jié)”。
“高位字節(jié)”使用了0x81-0xFE闸英,“低位字節(jié)”使用了0x40-0x7E锯岖,及0xA1-0xFE。在Big5的分區(qū)中:
- 0x8140-0xA0FE 保留給用戶自定義字符(造字區(qū))
- 0xA140-0xA3BF 標(biāo)點(diǎn)符號(hào)甫何、希臘字母及特殊符號(hào)出吹,
- 包括在0xA259-0xA261,安放了九個(gè)計(jì)量用漢字:兙兛?jī)羶纼膬艈憝櫦H辙喂。
- 0xA3C0-0xA3FE 保留捶牢。此區(qū)沒(méi)有開(kāi)放作造字區(qū)用。
- 0xA440-0xC67E 常用漢字加派,先按筆劃再按部首排序叫确。
- 0xC6A1-0xC8FE 保留給用戶自定義字符(造字區(qū))
- 0xC940-0xF9D5 次常用漢字跳芳,亦是先按筆劃再按部首排序芍锦。
- 0xF9D6-0xFEFE 保留給用戶自定義字符(造字區(qū))
Unicode和UCS
當(dāng)計(jì)算機(jī)傳到世界各個(gè)國(guó)家時(shí),為了適合當(dāng)?shù)卣Z(yǔ)言文字飞盆,都會(huì)實(shí)現(xiàn)各自的一套編碼方案娄琉。各國(guó)和地區(qū)在本地使用沒(méi)有問(wèn)題,當(dāng)互聯(lián)網(wǎng)出現(xiàn)時(shí)吓歇,各個(gè)國(guó)家地區(qū)相互溝通交流就會(huì)出現(xiàn)亂碼現(xiàn)象孽水。
為了解決這個(gè)問(wèn)題,歷史上存在兩個(gè)組織嘗試創(chuàng)立單一字符集而且相互都不知道對(duì)方的存在城看,即國(guó)際標(biāo)準(zhǔn)化組織(ISO)于1984年創(chuàng)建的ISO/IEC(后文簡(jiǎn)稱ISO)和由Xerox女气、Apple等軟件制造商于1988年組成的統(tǒng)一碼聯(lián)盟(后文簡(jiǎn)稱統(tǒng)一碼聯(lián)盟)。
ISO工作組制定的標(biāo)準(zhǔn)稱為通用字符集(Universal Character Set)测柠,簡(jiǎn)稱UCS炼鞠。
統(tǒng)一碼聯(lián)盟制定的標(biāo)準(zhǔn)稱為Unicode字符集。
1991年前后轰胁,兩個(gè)項(xiàng)目的參與者都認(rèn)識(shí)到谒主,世界不需要兩個(gè)不兼容的字符集。于是赃阀,它們開(kāi)始合并雙方的工作成果霎肯,但兩個(gè)項(xiàng)目仍都獨(dú)立存在,并獨(dú)立地公布各自的標(biāo)準(zhǔn)。不過(guò)統(tǒng)一碼聯(lián)盟和ISO/IEC都同意保持兩者標(biāo)準(zhǔn)的碼表兼容观游,并緊密地共同調(diào)整任何未來(lái)的擴(kuò)展搂捧。由于Unicode這一名字比較好記,因而它使用更為廣泛懂缕。后文僅介紹Unicode异旧。
編碼字符集
Unicode采用計(jì)劃四個(gè)字節(jié)表示一個(gè)字符,首位恒為0提佣,理論上最多能表示個(gè)字符吮蛹,完全可以涵蓋一切語(yǔ)言所用的符號(hào)。但目前Unicode字符分為17組編排拌屏,每組稱為平面(Plane)潮针,而每平面擁有65536(即2^16)個(gè)代碼點(diǎn)。然而目前只用了少數(shù)平面倚喂。
平面 | 始末字符值 | 中文名稱 | 英文名稱 |
---|---|---|---|
0號(hào)平面 | U+0000 - U+FFFF | 基本多文種平面 | Basic Multilingual Plane每篷,簡(jiǎn)稱BMP |
1號(hào)平面 | U+10000 - U+1FFFF | 多文種補(bǔ)充平面 | Supplementary Multilingual Plane,簡(jiǎn)稱SMP |
2號(hào)平面 | U+20000 - U+2FFFF | 表意文字補(bǔ)充平面 | Supplementary Ideographic Plane端圈,簡(jiǎn)稱SIP |
3號(hào)平面 | U+30000 - U+3FFFF | 表意文字第三平面(未正式使用) | Tertiary Ideographic Plane焦读,簡(jiǎn)稱TIP |
4號(hào)平面至13號(hào)平面 | U+40000 - U+DFFFF | (尚未使用) | |
14號(hào)平面 | U+E0000 - U+EFFFF | 特別用途補(bǔ)充平面 | Supplementary Special-purpose Plane,簡(jiǎn)稱SSP |
15號(hào)平面 | U+F0000 - U+FFFFF | 保留作為私人使用區(qū)(A區(qū)) | Private Use Area-A舱权,簡(jiǎn)稱PUA-A |
16號(hào)平面 | U+100000 - U+10FFFF | 保留作為私人使用區(qū)(B區(qū)) | Private Use Area-B矗晃,簡(jiǎn)稱PUA-B |
目前最常用的是基本多文種平面(Basic Multilingual Plane, BMP),或稱第0平面或0號(hào)平面(Plane 0)宴倍。編碼從U+0000至U+FFFF张症。
中文在Unicode中分布
Unicdoe1.1,收集中日韓三個(gè)國(guó)家的中文字符鸵贬,共20,902個(gè)字俗他,分布在U+4E00–U+9FFF這個(gè)區(qū)域。
Unicode3.0阔逼,于U+3400–U+4DFF加入了6,582個(gè)字兆衅。
Unicode3.1,于U+20000–U+2A6FF加入了42,711個(gè)字嗜浮。
Unicode4.1羡亩,于U+9FA6-U+9FB3和U+9FB4-U+9FBB共加入了22個(gè)字。
Unicode5.1周伦,于U+9FBC-U+9FC2加入了7個(gè)日語(yǔ)漢字夕春。
...
Unicode10.0,于U+2CEB0-U+2EBEF和U+9FD6-U+9FEA加入7494個(gè)漢字。
目前累計(jì)unicode中共收錄了87,882個(gè)中文字符专挪。
但常用中文范圍為0x4E00—0x9FA5之內(nèi)及志,如驗(yàn)證用戶輸入是否是中文片排,即可采用此范圍。
編碼方案
Unicode字符在實(shí)際傳輸過(guò)程中速侈,由于不同系統(tǒng)平臺(tái)的設(shè)計(jì)不一定一致率寡,以及出于節(jié)省空間的目的,對(duì)Unicode編碼的實(shí)現(xiàn)方式有所不同倚搬。
例如冶共,如果一個(gè)僅包含基本7位ASCII字符的Unicode文件,如果每個(gè)字符都使用2字節(jié)的原Unicode編碼傳輸每界,其第一字節(jié)的8位始終為0捅僵。這就造成了比較大的浪費(fèi)。
Unicode的轉(zhuǎn)換格式(Unicode Transformation Format眨层,簡(jiǎn)稱為UTF)庙楚,常見(jiàn)編碼轉(zhuǎn)換方案如下:
UTF-32
UTF-32編碼長(zhǎng)度是固定的,UTF-32中的每個(gè)32位值代表一個(gè)Unicode碼位趴樱,并且與該碼位的數(shù)值完全一致馒闷。
UTF-32的主要優(yōu)點(diǎn)是可以直接由Unicode碼位來(lái)索引。
UTF-32的主要缺點(diǎn)是每個(gè)碼位使用四個(gè)字節(jié)叁征,空間浪費(fèi)較多纳账。
UTF-16
UTF-16編碼長(zhǎng)度是不固定的,如果字符編碼U小于0x10000捺疼,也就是十進(jìn)制的0到65535之內(nèi)疏虫,則直接使用兩字節(jié)表示;
如果字符編碼U大于0x10000帅涂,由于UNICODE編碼范圍最大為0x10FFFF议薪,從0x10000到0x10FFFF之間共有0xFFFFF個(gè)編碼尤蛮,也就是需要20個(gè)bit就可以標(biāo)示這些編碼媳友。用U'表示從0-0xFFFFF之間的值,將其前 10 bit作為高位和16 bit的數(shù)值0xD800進(jìn)行 邏輯or 操作产捞,將后10 bit作為低位和0xDC00做 邏輯or 操作醇锚,這樣組成的 4個(gè)byte就構(gòu)成了U的編碼。
16進(jìn)制編碼范圍 | UTF-16表示方法(二進(jìn)制) | 10進(jìn)制碼范圍 | 字節(jié)數(shù)量 |
---|---|---|---|
U+0000~U+FFFF | xxxxxxxx xxxxxxxx yyyyyyyy yyyyyyyy | 0-65535 | 2 |
U+10000~U+10FFFF | 110110yyyyyyyyyy 110111xxxxxxxxxx | 65536-1114111 | 4 |
UTF-16的大端序(BE)和小端序(LE)
不同的計(jì)算機(jī)系統(tǒng)會(huì)以不同的順序保存字節(jié)坯临。這意味著字符U+4E2D在UTF-16編碼方式下可能被保存為4E 2D或者2D 4E焊唬,這取決于該系統(tǒng)使用的是大尾端(big-endian)還是小尾端(little-endian)。
其中Windows和linux操作系統(tǒng)內(nèi)核中使用的為UTF-16小端序看靠,而Mac OS則使用大端序赶促。
如某字符為十六進(jìn)制編碼4E59,按兩個(gè)字節(jié)拆分為4E和59
在Mac上讀取時(shí)是從低字節(jié)開(kāi)始挟炬,那么在Mac OS會(huì)認(rèn)為此4E59編碼為594E鸥滨,找到的字符為“奎”,而在Windows上從高字節(jié)開(kāi)始讀取嗦哆,則編碼為U+4E59的字符為“乙”。
就是說(shuō)在Windows下以UTF-16編碼保存一個(gè)字符“乙”婿滓,在Mac OS環(huán)境下打開(kāi)會(huì)顯示成“奎”老速。
所以為了弄清楚UTF-16文件的大小尾序,在UTF-16文件的開(kāi)首凸主,都會(huì)放置一個(gè)U+FEFF
字符作為Byte Order Mark(BOM)(UTF-16LE以FF FE代表橘券,UTF-16BE以FEFF代表),以顯示這個(gè)文本文件是以UTF-16編碼卿吐,其中U+FEFF
字符在UNICODE中代表的意義是ZERO WIDTH NO-BREAK SPACE(零寬度非換行空格)旁舰。
Unicode編碼
相當(dāng)于UTF-16的小端序(LE),任何字符都使用兩個(gè)或四個(gè)字節(jié)表示嗡官。
Unicode big endian
相當(dāng)于UTF-16的大端序(BE)鬓梅,任何字符都使用兩個(gè)或四個(gè)字節(jié)表示。
UTF-8
UTF-8是可變長(zhǎng)度字符編碼谨湘。是互聯(lián)網(wǎng)中應(yīng)用中優(yōu)先采用的編碼绽快。
UTF-8使用1至4個(gè)字節(jié)為每個(gè)字符編碼。具體規(guī)則如下:
范圍 | Byte 1 | Byte 2 | Byte 3 | Byte 4 |
---|---|---|---|---|
U+0000~U+007F | 0xxxxxxx | |||
U+0080~U+07FF | 110xxxxx | 10xxxxxx | ||
U+0800~U+FFFF | 1110xxxx | 10xxxxxx | 10xxxxxx | |
U+10000~U+10FFFF | 11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx |
小練習(xí)
: 請(qǐng)把字符U+FEFF使用UTF-8表示紧阔?
其他UTF
已走入歷史而很少再被使用UTF-7
尚未被完整開(kāi)發(fā)的UTF-6和UTF-5
ANSI編碼
為使計(jì)算機(jī)支持更多語(yǔ)言坊罢,通常使用 0x0080~0xFFFF 范圍的 2 個(gè)字節(jié)來(lái)表示 1 個(gè)字符。不同的國(guó)家和地區(qū)制定了不同的標(biāo)準(zhǔn)擅耽,由此產(chǎn)生了 GB2312活孩、GBK、GB18030乖仇、Big5憾儒、Shift_JIS等各自的編碼標(biāo)準(zhǔn)。這些使用多個(gè)字節(jié)來(lái)代表一個(gè)字符的各種漢字延伸編碼方式乃沙,稱為ANSI 編碼起趾。
ANSI編碼表示英文字符時(shí)用一個(gè)字節(jié),表示中文用兩個(gè)或四個(gè)字節(jié)警儒。
在簡(jiǎn)體中文Windows操作系統(tǒng)中训裆,ANSI 編碼代表 GBK編碼;
在繁體中文Windows操作系統(tǒng)中蜀铲,ANSI編碼代表Big5边琉;
在日文Windows操作系統(tǒng)中,ANSI 編碼代表 Shift_JIS 編碼记劝。
不同 ANSI 編碼之間互不兼容变姨,當(dāng)信息在國(guó)際間交流時(shí),無(wú)法將屬于兩種語(yǔ)言的文字厌丑,存儲(chǔ)在同一段 ANSI 編碼的文本中定欧。
練習(xí)
- 請(qǐng)把下面的2進(jìn)制序列轉(zhuǎn)換為字符别伏。
11101111 10111011 10111111
11100110 10001000 10010001
11100111 10001000 10110001
11100100 10111101 10100000
00110001 00110011 00110001
00110100 11100100 10111000
10101101 11100101 10011011 10111101 - 請(qǐng)查詢出“聯(lián)通”兩個(gè)字符的GBK編碼。
- 一個(gè)中文到底占幾個(gè)字節(jié)呢?
- String s="a??";s.length()==?