為什麼GBK不需要加BOM?

時間 2021-12-29 09:49:29

1樓:momo owo

因為GB2312標準誕生的太早了,那時候根本就沒有BOM這個概念。

現在硬碟儲存空間都論T賣了,所以很多人無法理解當年儲存空間的侷促,真的是那種多乙個位元組都能要了命的情況。當時也沒有網際網路,國際間的數字資訊交流不像現在這麼頻繁,所以各國制定的編碼都是用最簡單的方法實現本國文字顯示就算完事,頂多再相容一下ASCII,因為最常見的外語就是英語了。

這種簡單不僅是編碼層面的簡單,還有處理邏輯的盡量簡單,畢竟那個時候計算機執行的也不快,能少跑哪怕一條指令,對效率都是有提公升的,所以GB2312使用的邏輯也很簡單,只要判斷一下高位位元組也低位位元組的範圍就可以確定這個位元組是否屬於漢字,所有的漢字都是2個位元組,用最低限度的儲存空間來實現漢字的儲存。

2樓:flickzhou

不是不需要,是沒想弄BOM:

這東西在資料完整的情況下,能輔助軟體確定大小端;在位元組沒對齊的情況下,就沒用了。另外也不是所有軟體都支援BOM,比如Linux下的shell指令碼如果加上BOM就不能執行了。

針對儲存的GBK並沒有考慮大小端和位元組同步問題,如果弄反了大小端,或者有1個位元組錯位,就亂碼了。針對傳輸的UTF-8相對就健壯一些,所以可以考慮用UTF-8傳輸GBK碼。都2023年了,GBK早已是歷史,現在應該說GB18030了。

它的雙位元組部分基本上就是GBK,另外擴充套件了四位元組的編碼。看看雙位元組部分吧(我手頭的2005版是掃瞄版,不如這個2000版清晰):

3樓:qakcn

因為對於無BOM的檔案,預設是按照預設編碼來處理的。

Windows記事本預設就是語言所對應的編碼,簡體中文就是GBK,如果你去正體中文系統上開啟這個檔案就亂碼了。

還有的文字編輯器預設是按照Unicode來處理的,或者可以設定預設編碼。還有的有自動識別編碼的功能。

至於為什麼沒有BOM這個東西,那是因為BOM本來就是Unicode標準建議的,而且BOM(Byte Order Mark)是用來表示位元組序的(大端序Big Endian、小端序Little Endian)。UTF-8沒有位元組序區分,本來也不需要BOM,只不過可以加上來標記一下而已。

乙個字元0xABCD,如果檔案中儲存的是0xCD 0xAB就是小端序(低位位元組在前,高位位元組在後),0xAB 0xCD就是大端序。

如果兩個字元0xABCD 0xEF01,小端序0xCD 0xAB 0x01 0x EF,大端序0xAB 0xCD 0xEF 0x01。

如果是三位元組0xABCDEF,那麼小端序就是0xEF 0xCD 0xAB,大端序就是0xAB 0xCD 0xEF。

UTF-16和UTF-32區分位元組序。UTF-8是不區分的。

比如U+4E2D「中」,UTF-8編碼就是0xE4 0xB8 0xAD。UTF-16LE是0x2D 0x4E,UTF-16BE是0x4E 0x2D。UTF-32LE是 0x4E 0x2D 0x00 0x00,UTF-32BE是0x00 0x00 0x4E 0x2D。

為什麼父母不需要考試?

lzsj 我們先想象下,如果父母也要考試 採用3w 1h探索 what考什麼 when什麼時候考 where在哪考 how怎麼評判 what應該考父母手冊,你準備好迎接子女了嘛,你會用怎麼樣的方式撫養 教育孩子 與孩子相處。你現在工作穩定嗎,你有信心確保孩子能高枕無憂完成9年義務教育嗎,而不是把他 ...

為什麼nodejs不需要IO功能?

alsotang 專門來答個題支援一下 Twiknight 樓主的截圖是對 Node.js 一開始技術選型的說明,而且樓主的問題是帶有曲解的。Node.js 是帶有 IO 功能的。但 js 作為一門程式語言是不帶有 io 功能的。js 只有語言規範,一開始主要是跑在瀏覽器中,而在瀏覽器中的 ajax...

為什麼說腹肌不需要練?

我我我我不知道 誰和你說腹肌不要練的,當然瘦的人線條會明顯,但這麼說的話人們哪塊肌肉要練嘞,瘦不就完事了嗎?人們總是關注腹肌,就像提到手臂,就想到肱二頭肌,這是乙個十分外行的表現。因為每一塊肌肉都會有對抗肌,例如內側的肱二頭肌和外側的肱三頭肌,要是想提高整個手臂的力量,那麼這兩塊肌肉都要足夠發達,如...