UTF-8 的 BOM 檔頭

2023/02/02閱讀時間約 2 分鐘
UTF-8 萬國碼在規格定義時,有建議在文件的開始處,加入位元組順序記號 (BOM, byte-order mark)。但 Plain Text 文件,就是全部都是文字,將它加入檔頭標記,就不是純文字檔案了,所以一般都沒有實作成有 BOM 檔頭的檔案。
以這支 PHP 程式為例:
<?php

echo 'Aha.......'.PHP_EOL;

?>
若存成 BOM,在 Binary (或 Hex) 格式時,會出現 0xEF 0xBB 0xBF 三個 Bytes 的檔頭。如下圖:
BOM 檔頭程式檔案, 紅框處的 0xEF 0xBB 0xBF 就是 BOM
一般是存成沒有 BOM 檔頭的檔案,如下圖:
無 BOM 檔頭的程式檔案

解法一:存成有/無 BOM 的格式

一些編輯器 (諸如 UltraEdit, Visual Studio) 內定存檔是一般無 BOM 格式,但可以在存檔時,指定要存成 BOM 格式。如下面二張圖:
UltraEdit 在 Save as 時,指定登入 BOM 選項
Visual Studio 可以 Save as 指定 with (有 BOM) 或 without signature (無 BOM) 的 UTF-8

解法二:改設定讓程式可以判斷 BOM

PHP 直譯器,內定是不能跑有 BOM 檔頭的 PHP script 程式,若一定要跑有 BOM 檔頭的程式,就要改設定,將 php.ini 裡的 zend.multibyte 設成 On
; If enabled, scripts may be written in encodings that are incompatible with
; the scanner. CP936, Big5, CP949 and Shift_JIS are the examples of such
; encodings. To use this feature, mbstring extension must be enabled.
;zend.multibyte = Off
zend.multibyte = On
php.ini 內定 zend.multibyte 是 Off,設定成 On 時,遇到有 BOM 檔頭的程式也可以順利跑

解法三:寫程式去掉所有檔案的 BOM 檔頭


網路上有些文件說明如何用 PHP 程式去掉有 BOM 檔頭的 PHP 程式。但是這樣就比較麻煩了。
WILSON PENG
WILSON PENG
WILSON WAS HERE
留言0
查看全部
發表第一個留言支持創作者!