utf-8與utf-8無BOM的區別

來源:互聯網
上載者:User
BOM——Byte Order Mark,就是位元組序標記

在UCS 編碼中有一個叫做"ZERO WIDTH NO-BREAK SPACE"的字元,它的編碼是FEFF。而FFFE在UCS中是不存在的字元,所以不應該出現在實際傳輸中。UCS規範建議我們在傳輸位元組流前,先傳輸 字元"ZERO WIDTH NO-BREAK SPACE"。這樣如果接收者收到FEFF,就表明這個位元組流是Big-Endian的;如果收到FFFE,就表明這個位元組流是Little- Endian的。因此字元"ZERO WIDTH NO-BREAK SPACE"又被稱作BOM。

UTF-8不需要BOM來表明位元組順序,但可以用BOM來表明編碼方式。字元"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB BF。所以如果接收者收到以EF BB BF開頭的位元組流,就知道這是UTF-8編碼了。

UTF- 8編碼的檔案中,BOM佔三個位元組。如果用記事本把一個文字檔另存新檔UTF-8編碼方式的話,用UE開啟這個檔案,切換到十六進位編輯狀態就可以看到開 頭的FFFE了。這是個標識UTF-8編碼檔案的好辦法,軟體通過BOM來識別這個檔案是否是UTF-8編碼,很多軟體還要求讀入的檔案必須帶BOM。可 是,還是有很多軟體不能識別BOM。

在Firefox早期的版本裡,擴充是不能有BOM的,不過Firefox 1.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編碼分離出來根本沒有什麼必要。大多數情況下,直接binary in/binary out就好了

以上就介紹了utf-8與utf-8無BOM的區別 ,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.