星期二, 六月 17, 2008

PHP 判斷/移除 BOM(UTF-8)

BOM: 萬國碼檔案簽名 BOM (Byte Order Mark, U+FEFF)

BOM 的內容可以表示 UNICODE 是哪種編碼, 但是在接收到的檔案, 要拆解後寫入 DB, 看到 BOM 就覺得有點 ooxx.

utf8_encode 看到兩段程式可以來測試 寫入/移除 BOM.

將寫入的檔案內容前加 BOM

<?php
function writeUTF8File($filename,$content)
{
    $f = fopen($filename, 'w');
    fwrite($f, pack("CCC", 0xef,0xbb,0xbf));
    fwrite($f,$content);
    fclose($f);
}
?>

移除 BOM function

<?php
function removeBOM($str = '')
{
   if (substr($str, 0,3) == pack("CCC",0xef,0xbb,0xbf)) {
       $str = substr($str, 3);
   }
   return $str;
}
?>

由此上述 BOM = pack("CCC",0xef,0xbb,0xbf), 所以移除 BOM 的寫法可用上面的 removeBOM function 或 下述其一:

  • str_replace("\xef\xbb\xbf", '', $bom_content);
  • preg_replace("/^\xef\xbb\xbf/", '', $bom_content);

另外看到 判斷此字串是不是 UTF-8 的 function:

function isUTF8($string)
{
    return (utf8_encode(utf8_decode($string)) == $string);
}

其它相關網頁

相關標籤

this is comment icon 請問檔案的編碼 [回覆]

是否檔案(例如:字幕)也能判斷是不是UTF-8編碼嗎?(含 BOM 與不含 BOM 兩種)

Comment by yanren (03/30/2009 21:05)

this is comment icon 回 yanren [回覆]

可以~ :)

Comment by Tsung (03/30/2009 21:53)

this is comment icon 請問判斷檔案編碼是不是UTF-8 [回覆]

您好,想請教您,如果是要在 Linux 下判斷檔案是否為 UTF-8 編碼(含 BOM 或不含 BOM 都要可判斷),
是否有比較好的方式呢?(非使用PHP)

Comment by yanren (03/30/2009 22:47)

this is comment icon 回 yanren [回覆]

xxd -l 3 -p filename
如果出來結果是 efbbbf => BOM
不是則不是 BOM

Comment by Tsung (03/31/2009 03:36)

this is comment icon xxd -l 3 -p filename [回覆]

您好,謝謝!
我的疑問是並非所有檔案在UTF-8時都會加上efbbbf的 BOM,
所以,如果檔案 header 並沒有含入 efbbbf,
是否有辦法能判斷是不是UTF-8格式呢?

Comment by Hank (03/31/2009 09:26)

this is comment icon 回 Hank [回覆]

此文最下面那個 function 就可以判斷那篇是否是 UTF-8 的文章.
或者使用 iconv -f utf-8 -t big5 filename, 如果能順利轉換, 那也代表這篇文章是 UTF-8.

Comment by Tsung (03/31/2009 09:40)

this is comment icon about iconv [回覆]

謝謝您的回答。
iconv 的誤判率其實蠻高的,目前我還在找除了加上BOM,還有什麼方法或工具可以用來自動偵測檔案的編碼為 UTF-8 或是 BIG5、GB2312、ISO8859-1、....等。
看來要能自動偵測世界各國的編碼並不是那麼容易 XD

Comment by yanren (03/31/2009 11:49)

this is comment icon 回 yanren [回覆]

嗯嗯, 偵測世界各國編碼, PHP 有一個 function, 不過準確率確實也有點問題.
如果您有找到, 也勞煩您跟小弟指導一下, 我也蠻想知道怎麼解決此問題的. Orz..

Comment by Tsung (03/31/2009 11:59)
Add this page to del.icio.us

發表迴響

標題

內容 (限制 1000 字)

暱稱

電子郵件

個人網頁


 authimage


PS: 若無法留言, 請先確認是否有打開 JavaScript, 造成您的困擾, 實在萬分對不起 Orz...(如果無法留言, 勞煩可以發信給我好嗎? 謝謝.)
PS2: 若您的留言被誤判, 我都會再自行看過, 不需要一直重覆張貼~