「帶BOM 的UTF-8」和「無BOM 的UTF-8」有什麼區別

文章推薦指數: 80 %
投票人數:10人

UTF-8不需要BOM來表明位元組順序,但可以用BOM來表明編碼方式。

字元"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB BF。

所以如果接收者收到以EF BB ... 程式人生>>「帶BOM的UTF-8」和「無BOM的UTF-8」有什麼區別 「帶BOM的UTF-8」和「無BOM的UTF-8」有什麼區別 阿新••發佈:2019-01-29 BOM——ByteOrderMark,就是位元組序標記 在UCS編碼中有一個叫做"ZEROWIDTHNO-BREAKSPACE"的字元,它的編碼是FEFF。

而FFFE在UCS中是不存在的字元,所以不應該出現在實際傳輸中。

UCS規範建議我們在傳輸位元組流前,先傳輸字元"ZEROWIDTHNO-BREAKSPACE"。

這樣如果接收者收到FEFF,就表明這個位元組流是Big-Endian的;如果收到FFFE,就表明這個位元組流是Little-Endian的。

因此字元"ZEROWIDTHNO-BREAKSPACE"又被稱作BOM。

UTF-8不需要BOM來表明位元組順序,但可以用BOM來表明編碼方式。

字元"ZEROWIDTHNO-BREAKSPACE"的UTF-8編碼是EFBBBF。

所以如果接收者收到以EFBBBF開頭的位元組流,就知道這是UTF-8編碼了。

UTF-8編碼的檔案中,BOM佔三個位元組。

如果用記事本把一個文字檔案另存為UTF-8編碼方式的話,用UE開啟這個檔案,切換到十六進位制編輯狀態就可以看到開頭的FFFE了。

這是個標識UTF-8編碼檔案的好辦法,軟體通過BOM來識別這個檔案是否是UTF-8編碼,很多軟體還要求讀入的檔案必須帶BOM。

可是,還是有很多軟體不能識別BOM。

在Firefox早期的版本里,擴充套件是不能有BOM的,不過Firefox1.5以後的版本已經開始支援BOM了。

現在又發現,PHP也不支援BOM。

PHP在設計時就沒有考慮BOM的問題,也就是說他不會忽略UTF-8編碼的檔案開頭BOM的那三個字元。

由於必須在在Bo-Blog的wiki看到,同樣使用PHP的Bo-Blog也一樣受到BOM的困擾。

其中有提到另一個麻煩:“受COOKIE送出機制的限制,在這些檔案開頭已經有BOM的檔案中,COOKIE無法送出(因為在COOKIE送出前PHP已經送出了檔案頭),所以登入和登出功能失效。

一切依賴COOKIE、SESSION實現的功能全部無效。

”這個應該就是Wordpress後臺出現空白頁面的原因了,因為任何一個被執行的檔案包含了BOM,這三個字元都將被送出,導致依賴cookies和session的功能失效。

解決的辦法嘛,如果只包含英文字元(或者說ASCII編碼內的字元),就把檔案存成ASCII碼方式吧。

用UE等編輯器的話,點檔案->轉換->UTF-8轉ASCII,或者在另存為裡選擇ASCII編碼。

如果是DOS格式的行尾符,可以用記事本開啟,點另存為,選ASCII編碼。

如果包含中文字元的話,可以用UE的另存為功能,選擇“UTF-8無BOM”即可。

utf-8本來就不應該加bom,除了讓編輯器知道它是個utf-8之外什麼用處都沒有。

實際上編輯器完全有能力在不太多的幾個編碼格式之間根據特徵來判斷一個檔案是什麼編碼,就算不能自動識別,編輯器也應該有設定編碼的地方。

所以我覺得BOM對於utf-8來說是多餘的東西。

utf-16才需要加bom。

因為它是按unicode順序編碼,在BMP範圍內是二位元組,需要識別是大或小位元組序。

實際上,我覺得utf-8引入大小位元組序的概念太愚蠢了,不知道那些標準委員會是怎麼想的。

大小位元組序存在的意義,在於cpu的處理方式。

如果cpu是大字節序處理,那麼對於小位元組序,就必須做一層轉換,這帶來了效率上的下降。

但是在實際應用裡,誰會去關心大小位元組序?文字編碼引起位元組序的概念,只能說那些制定標準的人太死板了。

對於utf-16,我認為只要全世界都遵循一種位元組序方式,那就沒什麼必要用BOM來標註了。

話說回來,PHP是不支援utf-16編碼的檔案的。

因為例如$這個符號,在utf-8裡也是兩個位元組,PHP解碼器無法解析的。

不知道PHP6內部處理引入unicode的概念之後,對這個是否會有支援。

編碼問題是一個說起來簡單,但是實際上很繁瑣的東西。

很多程式,都有分層編碼的概念。

像MySQL,就分為client->connection->storage和storage->connection->result這些概念。

storage又分為system,database,table,column。

我有時候在想,有必要搞這麼複雜嘛,TNND。

像MySQL,誰用利用它這些特性阿?除非允許兩個client在不同的編碼環境下運作,否則它把client編碼分離出來根本沒有什麼必要。

大多數情況下,直接binaryin/binaryout就好了 【為什麼這個網頁程式碼

內的資訊會被瀏覽器理解為在內?】 巢狀錯誤是因為整個HTML文件的最開頭多了一個看不見的U+FEFF(就在「前面),它汙染了HTML。

U+FEFF就是我們常說的「BOM(byteordermark)」,也是@董鵬說的「signature」,UTF-8編碼的檔案不需要它。

Windows該死的記事本有個臭名昭著的破毛病就是在UTF-8檔案開頭加BOM,所以不要用記事本來編輯檔案。

可以用線上工具檢查你的網頁是否被多餘的BOM汙染了 作者:樑海 連結:https://www.zhihu.com/question/20138814/answer/14100483 來源:知乎 著作權歸作者所有。

商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

Qt操作多個Sqlite資料庫和檔案讀寫 «上一篇 JNI回撥時執行緒安全的處理下一篇» 相關推薦 「帶BOM的UTF-8」和「無BOM的UTF-8」有什麼區別 BOM——ByteOrderMark,就是位元組序標記 在UCS編碼中有一個叫做"ZEROWIDTHNO-... 什麽是lora物聯網技術LoRa和無線技術的區別 調制多節點物聯即使節點能量低功耗還需要形式隨著物聯網技術的發展,湧現出多種無線技術,在這些技術中,LPWA... 監督學習和無監督學習區別 前言 機器學習分為:監督學習,無監督學習,半監督學習(也可以用hinton所說的強化學習)等。

在這裡,主要理解一下監督學習和無監督學習。

監督學習(sup... 大資料12_SparkMLlib監督學習和無監督學習區別      那麼,什麼時候應該採用監督學習,什麼時候應該採用非監督學習呢?我也是從一次面試的過程中被問到這個問題以後才開始認真地考慮答案。

一種非常簡單的回... 聊聊Java中的併發佇列中有界佇列和無界佇列的區別 本文主要總體的說一說各種併發佇列  首先來一張全體照  從有界無界上分  常見的有界佇列為 ArrayBlocking... js變數中有var定義和無var定義的區別,es6中let命令和const命令 之前我們在寫js程式碼的時候都知道可以用var定義全域性變數和區域性變數,也可以省略var,而且在非嚴格模式下不會報錯,但是... 監督學習和無,監督學習區別 開始學習ML,真是難為自己的低智商了~ 一翻書就遇到一個概念問題:何為監督學習?與無監督學習的區別? 因為自己剛剛開始學ML... 什麼是lora物聯網技術LoRa和無線技術的區別   隨著物聯網技術的發展,湧現出多種無線技術,在這些技術中,LPWAN通訊技術中的其中一種形式LoRa技術出現,它的遠距離、低... 【前端踩過的坑】jsDate的時間戳timestamp和unix時間戳有區別麼? js獲取的時間戳的方式是(newDate()).getTime,得到的例如1534982400000,然後預... Unicode、UTF-8和ISO8859-1到底有什麽區別 stringram第一個不存在ring如果提交表單3.2tro說明:本文轉載於新浪博客,旨在方便知識總結。

... 搜尋 基礎教學 Mysql入門 Sql入門 Android入門 Docker入門 Go語言入門 Ruby程式入門 Python入門 Python進階 Django入門 Python爬蟲入門 最近訪問 「帶+BOM+的+UTF-8」和「無+BOM+的+UTF-8」有什麼區別 基於Datalog的知識推理 演算法中時間複雜度概括——o(1)、o(n)、o(logn)、o(nlogn) java中,方法引數是基本型別和引用型別的區別 【HTML+CSS+JavaScript】實現地址選擇聯動 將python執行結果儲存至本地檔案中 ACM+International+Collegiate+Programming+Contest,+Tishreen+Collegiate+Programming+Contest+(2018)+Syria,+Lattakia,+Tishreen+University,+April,+30,+2018 Oracle對表空間無權限 免費的Internet流量發生器+|+Free+Internet+Traffic+Generators windows下安裝Anaconda3之後再cmd下出現'activate'+不是內部或外部命令,也不是可執行的程式+或批處理檔案


請為這篇文章評分?