首頁 後端開發 php教程 utf-8與utf-8無BOM的區別

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

Aug 08, 2016 am 09:20 AM
ascii bom cookie php

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已經送出了檔案頭),所以登入和登出功能失效。 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教程有興趣的朋友有所幫助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

我後悔之前不知道的 7 個 PHP 函數 我後悔之前不知道的 7 個 PHP 函數 Nov 13, 2024 am 09:42 AM

如果您是經驗豐富的PHP 開發人員,您可能會感覺您已經在那裡並且已經完成了。操作

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

See all articles