字符集和字符編碼

計(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è)概念如下圖所示:

charset_charencoding.png

常見(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ē)鍵括袒、退格孩擂、換行鍵等)


USASCII_code_chart.png

常見(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ā)布饭庞,取名為GB2312GB2312-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提佣,理論上最多能表示2^{31}個(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í)

  1. 請(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
  2. 請(qǐng)查詢出“聯(lián)通”兩個(gè)字符的GBK編碼。
  3. 一個(gè)中文到底占幾個(gè)字節(jié)呢?
  4. String s="a??";s.length()==?
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末忧额,一起剝皮案震驚了整個(gè)濱河市厘肮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌睦番,老刑警劉巖类茂,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異托嚣,居然都是意外死亡巩检,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)示启,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)兢哭,“玉大人,你說(shuō)我怎么就攤上這事夫嗓〕俾荩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵舍咖,是天一觀的道長(zhǎng)矩父。 經(jīng)常有香客問(wèn)我,道長(zhǎng)排霉,這世上最難降的妖魔是什么窍株? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮攻柠,結(jié)果婚禮上球订,老公的妹妹穿的比我還像新娘。我一直安慰自己瑰钮,他們只是感情好冒滩,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著飞涂,像睡著了一般旦部。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上较店,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音容燕,去河邊找鬼梁呈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蘸秘,可吹牛的內(nèi)容都是我干的官卡。 我是一名探鬼主播蝗茁,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼寻咒!你這毒婦竟也來(lái)了哮翘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤毛秘,失蹤者是張志新(化名)和其女友劉穎饭寺,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體叫挟,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡艰匙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抹恳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片员凝。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖奋献,靈堂內(nèi)的尸體忽然破棺而出健霹,到底是詐尸還是另有隱情,我是刑警寧澤瓶蚂,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布骤公,位于F島的核電站,受9級(jí)特大地震影響扬跋,放射性物質(zhì)發(fā)生泄漏阶捆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一钦听、第九天 我趴在偏房一處隱蔽的房頂上張望洒试。 院中可真熱鬧,春花似錦朴上、人聲如沸垒棋。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)叼架。三九已至,卻和暖如春衣撬,著一層夾襖步出監(jiān)牢的瞬間乖订,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工具练, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乍构,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓扛点,卻偏偏與公主長(zhǎng)得像哥遮,于是被迫代替她去往敵國(guó)和親岂丘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 0 前言 在平時(shí)的開(kāi)發(fā)過(guò)程中大部分人應(yīng)該都遇到過(guò)中文亂碼問(wèn)題眠饮,瀏覽網(wǎng)頁(yè)時(shí)也會(huì)遇到內(nèi)容顯示亂碼的情況奥帘,一般遇到這種情...
    小豬啊嗚閱讀 2,541評(píng)論 1 10
  • 字符是用戶可以讀寫(xiě)的最小單位寨蹋。計(jì)算機(jī)所能支持的字符組成的集合,就叫做字符集返咱。字符集通常以二維表的形式存在钥庇。二維表的...
    劉惜有閱讀 8,070評(píng)論 2 14
  • 字符集 1、unicode字符集 (不是編碼咖摹,只是一個(gè)對(duì)某個(gè)值的二進(jìn)制定義) unicode字符集0000-fff...
    我是小胡胡分胡閱讀 838評(píng)論 0 0
  • title: 字符集和字符編碼詳解date: 2018-05-21 14:31:20tags: 聲明:本片文章轉(zhuǎn)載...
    會(huì)飛小超人閱讀 294評(píng)論 0 0
  • 亂碼 亂碼是怎么出現(xiàn)的呢评姨?對(duì)同一組二進(jìn)制數(shù)據(jù),不同的編碼會(huì)解析出不同的字符萤晴,用對(duì)了編碼吐句,解析出來(lái)的字符組成的文字是...
    __Jasmine__閱讀 600評(píng)論 0 0