2010年11月27日星期六

PHP UTF-8 編碼與 session 及 header 問題 (Solving BOM of UTF-8 File Encoding problem with PHP session and header)

網絡上不少跨語言網頁大部分都是以 UTF-8 作為編碼
但利用 UTF-8 編碼編寫 PHP 文件使用到 session 及 header 時便會發生問題
UTF-8 編碼的文件會在文件檔頭加上 3個bytes 的資料,這 3個bytes 稱為 BOM - Byte Order Mark
在標準制式下 UTF-8 的這 3個bytes 分別是:
第一個byte - 0xef
第二個byte - 0xbb
第三個byte - 0xbf
UTF-8 is a popular File Encoding on the internet.
However, when we use UTF-8 with PHP using session and header there are some error occurs.
UTF-8 file has 3 bytes of data at the beginning of file, this 3 bytes called BOM - Byte Order Mark
The standard of UTF-8 file of this 3 bytes is:
1st byte - 0xef
2nd byte - 0xbb
3rd byte - 0xbf


使用 ANSI 編碼的空白文件檔案大小為 0 byte
This file size is 0 byte when using ANSI


使用 UTF-8 編碼的文件,雖然是空白文件,但檔案大小為 3 bytes
When using UTF-8, Although the file is empty, the file size is 3 bytes

由於 PHP 使用 session 及部分 header 功能前是不允許有前置輸出,例如:
使用 session_start() 必須為第一句
使用 header("location:./somewhere") 不允許有輸出
當使用 UTF-8 由於有 BOM 的出現,使用這些功能便會發生問題
PHP cannot output any data when using session or some header, for example:
session_start() is the first statement
header("location:./somewhere") cannot have any output data
It is becuase UTF-8 file has BOM, when use these functions, some errors will occur


在 UTF-8 PHP 文件中使用 session
Using session in UTF-8 PHP file


文件大小為 25 bytes
file size is 25 bytes


由於 BOM 的問題,導致 session 出錯
The BOM problem to cause session error occurs

那是不是 PHP session 及 header 及 UTF-8 編號不能共存?不是,我們仍然可以讓兩者共存,但須要執行一些處理
It is PHP session and header cannot using UTF-8 ? No, but we need to do some handle

若使用 Windows 編製 UTF-8 PHP 文件,處理上便非常簡單
使用者可以安裝 Notepad++ , Notepad++ 是一種免費的文字編輯軟件
而 Notepad++ 預設已經具有製作不具 BOM 的 UTF-8 文件的功能
只需要在 編碼 選擇 轉換至 UTF-8 碼格式 (檔首無 BOM) 便可以建立一個沒有 BOM 的 UTF-8 文件
If you are using Windows, it is an easy task to solve it
User can install Notepad++ which is a free text editor
Use Notepad++ and create a UTF-8 file without BOM
Open the file with Notepad++, then browse Format on the menu bar and select Convert to UTF-8 without BOM


使用 Notepad++ 修改 UTF-8 文件為不含 BOM 的 UTF-8 文件
Using Notepad++ to edit UTF-8 file without BOM


session 沒有出錯
session without errors

但是 Notepad++ 只能在 Windows 中安裝 (WineHQ 另計),那 Linux、Unix、Mac 系統應如何處理?
(正常情況下在 Linux、Unix、Mac 都是以 UTF-8 建立文字文件,亦已經將 BOM 處理好
但若果編輯來自 Windows 的 UTF-8 文件還是有機會發生這問題)
However, Notepad++ can only install in Windows (expert WineHQ), then how to solve this problem in Linux, Unix, Mac
(Normally, Linux, Unix, Mac is using UTF-8 to create any text file, and solve the BOM already
However, when edit an UTF-8 file from Windows, still has this problem)

我們先製作一個 PHP 文件 (如果使用 Windows 請以 ANSI 為編碼)
PHP 文件中輸入以下程序:
We need to create a PHP file (Use ANSI in Windows)
Type the code below to the PHP file
<?
$pathname = "test.php";
$file_handler = fopen($pathname, "r");
$contents = fread($file_handler, filesize($pathname));
fclose($file_handler);
for ($i = 0; $i < 3; $i++){
    $bytes[$i] = ord(substr($contents, $i, 1));
}
if ($bytes[0] == 0xef && $bytes[1] == 0xbb && $bytes[2] == 0xbf){
    $file_handler = fopen($pathname, "w");
    fwrite($file_handler, substr($contents, 3));
    fclose($file_handler);
    printf("%s BOM removed", $pathname);
}
?>

然後執行此程序,便可以將目標文件的 BOM 刪除
Then run this program to remove the BOM of target file


編輯刪除 BOM 的程序
Create a program to remove BOM


執行程序刪除目標文件的 BOM
Run the program to remove the BOM of target file


session 沒有出錯
session without errors

另外設計者還可以考慮使用 Java 或 C++ 等跨平台電腦語言來處理 UTF-8 的 BOM 問題
You also can write a standalone program like Java or C++ or any cross-platform language to solve this problem

沒有留言 :

發佈留言