字符編碼發(fā)展史6 — BOM字節(jié)序標(biāo)記
上一篇《字符編碼發(fā)展史5 — UTF-16和UTF-32》我們講解了UTF-16和UTF-32編碼。本篇我們將繼續(xù)講解字符編碼中的字節(jié)序標(biāo)記(BOM)。
2.3. 第三個(gè)階段 國際化
2.3.2. Unicode的編碼方式
2.3.2.5. BOM
1. 什么是BOM?
BOM是Byte Order Mark的縮寫,翻譯成中文是:字節(jié)序標(biāo)記,主要用于文本編碼中,表示數(shù)據(jù)存儲(chǔ)的字節(jié)順序。
前面我們講到UTF-16和UTF-32是存在大小端的字節(jié)序問題的。以UTF-16為例,要識(shí)別一個(gè)文件是以大端(Big-endian)字節(jié)序還是小端(Little-endian)字節(jié)序存儲(chǔ)的,就需要有一個(gè)標(biāo)識(shí)來進(jìn)行標(biāo)記。業(yè)界統(tǒng)一的做法是:在文件的開頭加入一個(gè)特殊的字符來表示,該字符就是U+FEFF,因此BOM也可認(rèn)為是該字符(U+FEFF)的一個(gè)別名。
- 在UTF-16BE文件中,BOM是
0xFE 0xFF; - 在UTF-16LE文件中,BOM是
0xFF 0xFE; - 在UTF-32BE文件中,BOM是
0x00 0x00 0xFE 0xFF; - 在UTF-32LE文件中,BOM是
0xFF 0xFE 0x00 0x00。
2. Windows下為什么會(huì)有UTF-8和UTF-8BOM?
UTF-8編碼本身并不存在字節(jié)序的問題,所以UTF-8編碼理論上是不需要字節(jié)序的。
熟悉Windows的同學(xué)應(yīng)該知道,Windows的“記事本”在保存時(shí)可以選擇編碼方式,編碼方式的下拉框里有UTF-8和UTF-8 BOM。我們以UTF-8 BOM保存時(shí),文件的開頭三個(gè)字節(jié)是0xEF 0xBB 0xBF,這就是UTF-8 BOM的標(biāo)識(shí)。

記事本保存的編碼格式

在VSCode中以Hex Editor方式打開
為什么Windows下為什么有UTF-8 BOM,這個(gè)已經(jīng)無從查證,很可能是Windows歷史發(fā)展的遺留產(chǎn)物。猜測(cè)可能是為了明確標(biāo)識(shí)某個(gè)文件是由UTF-8編碼方式存儲(chǔ)的。因?yàn)樽址幋a的發(fā)展歷史來看,UTF-8的出現(xiàn)晚于ANSI系列編碼,Windows早期為了適配各個(gè)國家的語言,系統(tǒng)默認(rèn)編碼采用了ANSI系列的編碼,美國和西歐地區(qū)默認(rèn)編碼是ISO-8859-1,中國大陸默認(rèn)編碼編碼是GBK。如:在Windows下有一個(gè)XXX.txt的純文本文件,如果不加字節(jié)序標(biāo)記則無法知道這個(gè)文件是UTF-8編碼的還是GBK編碼的。如果UTF-8編碼的文件默認(rèn)加上BOM標(biāo)識(shí),則可以通過這個(gè)標(biāo)識(shí)來區(qū)分是UTF-8還是GBK編碼。
在Windows11下,我們看到新建的.txt文件,windows的記事本會(huì)默認(rèn)以UTF-8(無BOM)來保存了,說明Windows操作系統(tǒng)新的版本也默認(rèn)使用UTF-8編碼了。
就跨平臺(tái)的兼容性而言,UTF-8會(huì)比UTF-8 BOM更好。
3. 不同編碼的字節(jié)序總結(jié)
| 編碼方式 | BOM字節(jié)序標(biāo)識(shí) |
|---|---|
| UTF-8 | 無 |
| UTF-8 BOM | 0xEF 0xBB 0xBF |
| UTF-16BE | 0xFE 0xFF |
| UTF-16LE | 0xFF 0xFE |
| UTF-32BE | 0x00 0x00 0xFE 0xFF |
| UTF-32LE | 0xFF 0xFE 0x00 0x00 |
《字符編碼發(fā)展史》系列已完結(jié)
歷史文章推薦:
大家好,我是陌塵。
IT從業(yè)10年+, 北漂過也深漂過,目前暫定居于杭州,未來不知還會(huì)飄向何方。
搞了8年C++,也干過2年前端;用Python寫過書,也玩過一點(diǎn)PHP,未來還會(huì)折騰更多東西,不死不休。
感謝大家的關(guān)注,期待與你一起成長(zhǎng)。

浙公網(wǎng)安備 33010602011771號(hào)