字符集、編碼字符集翁涤、字符編碼集铁蹈、unicode千元、utf8、utf16

轉(zhuǎn)載需注明原地址,謝謝

目標(biāo):徹底弄懂字符集习蓬、編碼字符集、字符編碼集富纸、unicode集畅、utf8、utf16

1.什么叫字符集届谈。

答:比如中文就可以叫漢子字符集扰柠,英文也可以叫英文字符集,總之就是指的一套字符的集合疼约。

2.什么叫編碼字符集

答:比如 我們規(guī)定 0 代表 我卤档,1代表你,等等程剥。 我們對(duì)字符集進(jìn)行編碼劝枣,一個(gè)字符對(duì)應(yīng)一個(gè)整數(shù)序號(hào)(code point),這樣集合就叫編碼字符集织鲸。

其中較為出名的有:unicode舔腾、ascii。

3.什么叫字符編碼集

首先講講為什么字符編碼集的來(lái)歷搂擦。
有了編碼字符集后稳诚,下一步就是把字符的 code point 映射到計(jì)算機(jī)中。
常見(jiàn)的如ascii編碼集瀑踢,字符編碼集中的數(shù)字與編碼字符集中的數(shù)字字符一一對(duì)應(yīng)扳还。
然而ascii只有127個(gè)code point,當(dāng)然可以完美表示橱夭。
而unicode有理論上有U+10FFFFcode point氨距,
如果采取一一對(duì)應(yīng)的方式,那么ascii表示需要1個(gè)字節(jié)的字符到unicode上需要3個(gè)字節(jié)棘劣。
而實(shí)際開(kāi)發(fā)中俏让,ascii的使用頻率遠(yuǎn)遠(yuǎn)高于其他unicode字符,為了兼容其他字符,就讓內(nèi)存擴(kuò)大3倍首昔,所以這種一一對(duì)應(yīng)的方式是不可取的寡喝。

那么如何選擇一個(gè)合適的編碼方案呢?

  • 1.首先字符編碼集應(yīng)該是變長(zhǎng)的勒奇,且越是高頻的字符越是含的字節(jié)少拘荡,這樣可以最大程度上優(yōu)化使用內(nèi)存。
  • 2.其次撬陵,最好能夠兼容一部分字符集珊皿。

綜上考慮:

誕生了UTF系列和UCS系列編碼
其中UTF分為UTF-8,UTF-16,UTF-32分別代表著用8位,16位巨税,32位來(lái)代表某個(gè)單個(gè)code point蟋定。
其中UTF8和UTF16最為常用。

4.unicode

1.萬(wàn)國(guó)碼草添。與ascii兼容

2.分成17區(qū)域驶兜,每個(gè)區(qū)域我們稱為一個(gè)平面,其中每一個(gè)平面包含65536(0xFFFF)個(gè)code point远寸,第一個(gè)平面 0U+FFFF抄淑,第二個(gè)平面U+10000U+1FFFF,以此類推驰后。前兩位是編號(hào)肆资,范圍在0x0~0x10之間,后4位為代碼點(diǎn)灶芝。

3.最常見(jiàn)的是第一個(gè)平面郑原,這個(gè)平面被稱為 多語(yǔ)言平面(BMP)

4.unicode分成utf和ucs系列編碼。

5.如何判斷大小端夜涕?

  • 什么叫大小端犯犁? 大端含義,從左往右讀(常見(jiàn))女器,小端酸役,從右往左讀。http://www.ruanyifeng.com/blog/2016/11/byte-order.html

  • unicode規(guī)定:

  • 那么很自然的驾胆,就會(huì)出現(xiàn)一個(gè)問(wèn)題:計(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驹愚,就表示該文件采用小頭方式。

  • 注意:這個(gè)規(guī)定是針對(duì)文件而言劣纲。實(shí)時(shí)上對(duì)于字節(jié)流而言逢捺,這沒(méi)什么意義。

5.utf-8

1.變長(zhǎng)癞季,兼容ascii

image.png

首位0:表示1字節(jié)
首位110:表示2字節(jié)
首位1110:表示3字節(jié)
首位11110:表示4字節(jié)
….

10表示當(dāng)前字節(jié)不是首位劫瞳,為中間字節(jié)。
這里有個(gè)細(xì)節(jié)绷柒,為什么要中間字節(jié)為10而不是0呢志于?
如果用0表示,相同的字節(jié)可以表示更多的位废睦。
但是作者為了兼容ascii伺绽,所以犧牲了一部分位。不然中文就可以2個(gè)字節(jié)表示也說(shuō)不定嗜湃。

指的注意的是:這種變長(zhǎng)字符的方式還有其他的方式奈应,例如mqtt 的消息里面的剩余字符字段就是變長(zhǎng)的方式。

每個(gè)字節(jié)只用前7位购披,0表示結(jié)束杖挣,1表示還有剩余。

兩種編碼對(duì)比:

同樣都支持ascii刚陡。

utf8的變長(zhǎng)方式:可以知道提前知道有幾個(gè)字節(jié)程梦,起到一個(gè)校驗(yàn)的作用,但是會(huì)導(dǎo)致浪費(fèi)一部分字節(jié)橘荠。

mqtt remaining字段的變長(zhǎng)方式:無(wú)法知道有多少字節(jié)屿附,但是會(huì)節(jié)省一部分字節(jié)。

6.utf-16

對(duì)于unicode BMP的65536個(gè)字符哥童,采取一一映射到16位數(shù)值的方式挺份。即采用2個(gè)字節(jié),一個(gè)代碼單元贮懈。

對(duì)于超過(guò)16位的數(shù)值匀泊,采用4個(gè)字節(jié),即兩個(gè)代碼單元組成朵你,這兩個(gè)代碼單元稱為一個(gè)代理項(xiàng)對(duì)(surrogate pair)

注意U+D800和U+DFFF中間是unicode是沒(méi)有定義字符各聘,這是專門(mén)為UTF-16考慮的。

我們知道非BMP字符范圍在U+10000~U+10FFFF抡医,總共包含0xFFFFF個(gè)code point躲因,即20位早敬。

  • 我們將前10位作為代理項(xiàng)的高位代理,我們將前10位+0XD800可以得到范圍是 0XD800~0XDBFF

  • 我們將后10位作為代理項(xiàng)的低位代理大脉,我們將后10位+0XDC00可以得到范圍是 0XDC00~0XDFFF

可通過(guò)代碼看出:

這樣的好處在于搞监,可以分清楚一個(gè)代碼單元(16位),屬于BMP還是高代理項(xiàng)還是低代理項(xiàng)镰矿。三者的數(shù)字范圍互不重疊琐驴。

UTF16和UTF8都有”自我同步”的特點(diǎn),即通過(guò)一個(gè)代碼點(diǎn)秤标,就能推導(dǎo)出完整的代碼序列绝淡,可以知道哪個(gè)字節(jié)開(kāi)始,那個(gè)字節(jié)結(jié)束苍姜。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末牢酵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子怖现,更是在濱河造成了極大的恐慌茁帽,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屈嗤,死亡現(xiàn)場(chǎng)離奇詭異潘拨,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)饶号,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)铁追,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人茫船,你說(shuō)我怎么就攤上這事琅束。” “怎么了算谈?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵涩禀,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我然眼,道長(zhǎng)艾船,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任高每,我火速辦了婚禮屿岂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鲸匿。我一直安慰自己爷怀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布带欢。 她就那樣靜靜地躺著运授,像睡著了一般烤惊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上徒坡,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天撕氧,我揣著相機(jī)與錄音瘤缩,去河邊找鬼喇完。 笑死,一個(gè)胖子當(dāng)著我的面吹牛剥啤,可吹牛的內(nèi)容都是我干的锦溪。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼府怯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼刻诊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起牺丙,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤则涯,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后冲簿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體粟判,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年峦剔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了档礁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吝沫,死狀恐怖呻澜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惨险,我是刑警寧澤羹幸,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站辫愉,受9級(jí)特大地震影響栅受,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜一屋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一窘疮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冀墨,春花似錦闸衫、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)弟翘。三九已至,卻和暖如春骄酗,著一層夾襖步出監(jiān)牢的瞬間稀余,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工趋翻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留睛琳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓踏烙,卻偏偏與公主長(zhǎng)得像师骗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子讨惩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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