字符集和字符編碼

計(jì)算機(jī)是如何表示字符的?

計(jì)算中的數(shù)據(jù)都是二進(jìn)制(0和1),用一位來(lái)存儲(chǔ)1個(gè)0或1,稱(chēng)為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)的總稱(chēng),包括各國(guó)家文字、標(biāo)點(diǎn)符號(hào)、圖形符號(hào)、數(shù)字等。

字符表
: 是一個(gè)系統(tǒng)支持的所有字符的集合。

字符集
: 又稱(chē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。全稱(chēng)為《信息交換用漢字編碼字符集·基本集》。

只收錄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è)):常用漢字(也稱(chēng)一級(jí)漢字),按拼音排序;
  • 56~87區(qū)(3008個(gè)):非常用漢字(也稱(chēng)二級(jí)漢字),按部首/筆畫(huà)排序;
  • 88~94區(qū):空區(qū),留待擴(kuò)展。

GB2312編碼方式

為了兼容ASCII字符集,GB2312規(guī)定一個(gè)小于127的字符的意義與原來(lái)相同。
但兩個(gè)大于127的字符連在一起時(shí),就表示一個(gè)GB2312字符。
每個(gè)字符以?xún)蓚€(gè)字節(jié)來(lái)表示。第一個(gè)字節(jié)稱(chēng)為“高位字節(jié)”,第二個(gè)字節(jié)稱(chēng)為“低位字節(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),基本滿(mǎ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é)的第一位??傮w上說(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ā)布了最新的字符集,稱(chēng)之為GB18030,全稱(chēng)為國(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ǔ)方法,以?xún)蓚€(gè)字節(jié)來(lái)安放一個(gè)字。第一個(gè)字節(jié)稱(chēng)為“高位字節(jié)”,第二個(gè)字節(jié)稱(chēng)為“低位字節(jié)”。
“高位字節(jié)”使用了0x81-0xFE,“低位字節(jié)”使用了0x40-0x7E,及0xA1-0xFE。在Big5的分區(qū)中:

  • 0x8140-0xA0FE 保留給用戶(hù)自定義字符(造字區(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 保留給用戶(hù)自定義字符(造字區(qū))
  • 0xC940-0xF9D5 次常用漢字,亦是先按筆劃再按部首排序。
  • 0xF9D6-0xFEFE 保留給用戶(hù)自定義字符(造字區(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)稱(chēng)ISO)和由Xerox、Apple等軟件制造商于1988年組成的統(tǒng)一碼聯(lián)盟(后文簡(jiǎn)稱(chēng)統(tǒng)一碼聯(lián)盟)。

ISO工作組制定的標(biāo)準(zhǔn)稱(chēng)為通用字符集(Universal Character Set),簡(jiǎn)稱(chēng)UCS。
統(tǒng)一碼聯(lián)盟制定的標(biāo)準(zhǔn)稱(chēng)為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組編排,每組稱(chēng)為平面(Plane),而每平面擁有65536(即2^16)個(gè)代碼點(diǎn)。然而目前只用了少數(shù)平面。

平面 始末字符值 中文名稱(chēng) 英文名稱(chēng)
0號(hào)平面 U+0000 - U+FFFF 基本多文種平面 Basic Multilingual Plane,簡(jiǎn)稱(chēng)BMP
1號(hào)平面 U+10000 - U+1FFFF 多文種補(bǔ)充平面 Supplementary Multilingual Plane,簡(jiǎn)稱(chēng)SMP
2號(hào)平面 U+20000 - U+2FFFF 表意文字補(bǔ)充平面 Supplementary Ideographic Plane,簡(jiǎn)稱(chēng)SIP
3號(hào)平面 U+30000 - U+3FFFF 表意文字第三平面(未正式使用) Tertiary Ideographic Plane,簡(jiǎn)稱(chēng)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)稱(chēng)SSP
15號(hào)平面 U+F0000 - U+FFFFF 保留作為私人使用區(qū)(A區(qū)) Private Use Area-A,簡(jiǎn)稱(chēng)PUA-A
16號(hào)平面 U+100000 - U+10FFFF 保留作為私人使用區(qū)(B區(qū)) Private Use Area-B,簡(jiǎn)稱(chēng)PUA-B

目前最常用的是基本多文種平面(Basic Multilingual Plane, BMP),或稱(chēng)第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)證用戶(hù)輸入是否是中文,即可采用此范圍。

編碼方案

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)稱(chēng)為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è)字符的各種漢字延伸編碼方式,稱(chēng)為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)查詢(xún)出“聯(lián)通”兩個(gè)字符的GBK編碼。
  3. 一個(gè)中文到底占幾個(gè)字節(jié)呢?
  4. String s="a??";s.length()==?
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容