深入理解Emoji(二) —— 字節(jié)序和BOM

上篇主要了解了字符集和字符集編碼的相關(guān)知識(shí)浙宜,其中有提到字節(jié)序的問題平夜,這篇我們便深入探討下這方面的知識(shí)线脚。

字節(jié)序

字節(jié)順序那婉,又稱端序尾序(英語:Endianness)板甘。在計(jì)算機(jī)科學(xué)領(lǐng)域中,是跨越多字節(jié)的程序?qū)ο蟮拇鎯?chǔ)規(guī)則详炬。在幾乎所有的機(jī)器上虾啦,多字節(jié)對(duì)象都被存儲(chǔ)為連續(xù)的字節(jié)序列。例如在Java中,一個(gè)int類型的變量a地址為0x100傲醉,且x的四個(gè)字節(jié)將被存儲(chǔ)在存儲(chǔ)器的0x100, 0x101, 0x102, 0x103位置。而存儲(chǔ)地址內(nèi)的排列則有兩個(gè)通用規(guī)則呻率。一個(gè)多位的整數(shù)將按照其存儲(chǔ)地址的最低或最高字節(jié)排列硬毕。如果最低有效位最高有效位的前面,則稱小端序礼仗;反之則稱大端序吐咳。在網(wǎng)絡(luò)應(yīng)用中,字節(jié)序是一個(gè)必須被考慮的因素元践,因?yàn)椴煌瑱C(jī)器類型可能采用不同標(biāo)準(zhǔn)的字節(jié)序韭脊,所以均按照網(wǎng)絡(luò)標(biāo)準(zhǔn)轉(zhuǎn)化。

例如假設(shè)上述變量x類型為int单旁,位于地址0x100處沪羔,它的十六進(jìn)制為0x01234567,地址范圍為0x100~0x103字節(jié)象浑,其內(nèi)部排列順序依賴于機(jī)器的類型蔫饰。大端法從首位開始將是:0x100: 01, 0x101: 23,..。而小端法將是:0x100: 67, 0x101: 45,..愉豺。

大端序

高位字節(jié)在前篓吁,低位字節(jié)在后,這是人類習(xí)慣的讀寫數(shù)值方法蚪拦。以一個(gè)值為0x0A0B0C0D的int類型變量為例杖剪,它的內(nèi)存為0x100~0x103,則:

內(nèi)存地址 0x100 0x101 0x102 0x103
存儲(chǔ)單元 0x0A 0X0B 0X0C 0X0D

示例中驰贷,最高位字節(jié)是0x0A 存儲(chǔ)在最低的內(nèi)存地址處盛嘿。下一個(gè)字節(jié)0x0B存在后面的地址處。正類似于十六進(jìn)制字節(jié)從左到右的閱讀順序饱苟。

小端序

低位字節(jié)在前孩擂,高位字節(jié)在后,現(xiàn)大部分計(jì)算機(jī)內(nèi)部處理都是小端序箱熬。同樣以上面做例子:

內(nèi)存地址 0x100 0x101 0x102 0x103
存儲(chǔ)單元 0x0D 0X0C 0X0B 0X0A

最低位字節(jié)是0x0D 存儲(chǔ)在最低的內(nèi)存地址處类垦。后面字節(jié)依次存在后面的地址處。

實(shí)際意義

到這里我們可以發(fā)現(xiàn)城须,在日常開發(fā)中蚤认,如果不熟悉字節(jié)序的情況下,在涉及字節(jié)的讀取和解析容易出現(xiàn)問題糕伐,那么砰琢,為什么要區(qū)分大端和小端呢,統(tǒng)一不是更方便嗎?
其實(shí)這里涉及一個(gè)效率的問題陪汽,計(jì)算機(jī)電路先處理低位字節(jié)训唱,效率比較高,因?yàn)橛?jì)算都是從低位開始的挚冤。如果都是大端序况增,則計(jì)算時(shí)需要從高位找到低位,再從低位計(jì)算到高位训挡,影響效率澳骤。所以,計(jì)算機(jī)的內(nèi)部處理都是小端字節(jié)序澜薄。但是我們?nèi)祟愡€是習(xí)慣讀寫大端字節(jié)序为肮。所以,除了計(jì)算機(jī)的內(nèi)部處理肤京,其他的場(chǎng)合幾乎都是大端字節(jié)序颊艳,比如網(wǎng)絡(luò)傳輸和文件儲(chǔ)存。

計(jì)算機(jī)處理字節(jié)序的時(shí)候蟆沫,不知道什么是高位字節(jié)籽暇,什么是低位字節(jié)。它只知道按順序讀取字節(jié)饭庞,先讀第一個(gè)字節(jié)戒悠,再讀第二個(gè)字節(jié)。如果是大端字節(jié)序舟山,先讀到的就是高位字節(jié)绸狐,后讀到的就是低位字節(jié)。小端字節(jié)序正好相反累盗。只有讀取的時(shí)候寒矿,才必須區(qū)分字節(jié)序,其他情況都不用考慮若债。

BOM

我們知道符相,UTF-16和UTF-32都是多字節(jié)的編碼規(guī)則,那在讀取的時(shí)候必然也會(huì)涉及到字節(jié)序的問題蠢琳,計(jì)算機(jī)是通過什么判斷編碼之后的字節(jié)序呢啊终,答案就是BOM。

字節(jié)順序標(biāo)記(byte-order mark傲须,BOM)是位于碼點(diǎn)U+FEFF的統(tǒng)一碼字符的名稱蓝牲。當(dāng)以UTF-16或UTF-32來將UCS/統(tǒng)一碼字符所組成的字符串編碼時(shí),這個(gè)字符被用來標(biāo)示其字節(jié)序泰讽。它常被用來當(dāng)做標(biāo)示文件是以UTF-8例衍、UTF-16或UTF-32編碼的標(biāo)記昔期。而 FFFE 在 UCS 中是不存在的字符,所以不會(huì)出現(xiàn)在實(shí)際傳輸中佛玄。UCS 規(guī)范建議我們?cè)趥鬏斪止?jié)流前硼一,先傳輸BOM標(biāo)記。這樣如果接收者收到 FEFF翎嫡,就表明這個(gè)字節(jié)流是大端序的欠动;如果收到 FFFE,就表明這個(gè)字節(jié)流是小端序的惑申。

不同編碼的字節(jié)順序標(biāo)記的表示

UTF-8 不需要 BOM 來表明字節(jié)順序,但可以用 BOM 來表明編碼方式翅雏。BOM的 UTF-8 編碼是 EF BB BF圈驼。所以如果接收者收到以 EF BB BF 開頭的字節(jié)流,就知道這是 UTF-8 編碼了望几。Windows 就是使用 BOM 來標(biāo)記文本文件的編碼方式的绩脆。微軟在 UTF-8 中使用 BOM 是因?yàn)檫@樣可以把 UTF-8 和 ASCII 等編碼明確區(qū)分開,但這樣的文件在 Windows 之外的操作系統(tǒng)里會(huì)帶來問題橄抹。

最后我們?cè)賮韺?duì)比一下攜帶BOM之后UTF-16編碼所得到的結(jié)果靴迫,其中UTF-16BE代表大端序,UTF-16LE代表小端序:


UTF-16編碼
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末楼誓,一起剝皮案震驚了整個(gè)濱河市玉锌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疟羹,老刑警劉巖主守,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異榄融,居然都是意外死亡参淫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門愧杯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涎才,“玉大人,你說我怎么就攤上這事力九∷M” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵畏邢,是天一觀的道長(zhǎng)业扒。 經(jīng)常有香客問我,道長(zhǎng)舒萎,這世上最難降的妖魔是什么程储? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任蹭沛,我火速辦了婚禮,結(jié)果婚禮上章鲤,老公的妹妹穿的比我還像新娘摊灭。我一直安慰自己,他們只是感情好败徊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布帚呼。 她就那樣靜靜地躺著,像睡著了一般皱蹦。 火紅的嫁衣襯著肌膚如雪煤杀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天沪哺,我揣著相機(jī)與錄音沈自,去河邊找鬼。 笑死辜妓,一個(gè)胖子當(dāng)著我的面吹牛枯途,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播籍滴,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼酪夷,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了孽惰?” 一聲冷哼從身側(cè)響起晚岭,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎灰瞻,沒想到半個(gè)月后腥例,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酝润,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年燎竖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片要销。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡构回,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疏咐,到底是詐尸還是另有隱情纤掸,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布浑塞,位于F島的核電站借跪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏酌壕。R本人自食惡果不足惜掏愁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一歇由、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧果港,春花似錦沦泌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至萝衩,卻和暖如春回挽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背猩谊。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工厅各, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人预柒。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像袁梗,于是被迫代替她去往敵國(guó)和親宜鸯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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