2012-04-24 65 views
39

使用PHP5(cgi)從文件系統中輸出模板文件,並遇到吐出原始HTML的問題。如何在「<!DOCTYPE>」之前刪除多個UTF-8 BOM序列?

private function fetch($name) { 
    $path = $this->j->config['template_path'] . $name . '.html'; 
    if (!file_exists($path)) { 
     dbgerror('Could not find the template "' . $name . '" in ' . $path); 
    } 
    $f = fopen($path, 'r'); 
    $t = fread($f, filesize($path)); 
    fclose($f); 
    if (substr($t, 0, 3) == b'\xef\xbb\xbf') { 
     $t = substr($t, 3); 
    } 
    return $t; 
} 

即使我已經添加了BOM修正,但我仍然遇到Firefox接受它的問題。你可以在這裏看到一個活的副本:http://ircb.in/jisti/(和模板文件我扔在http://ircb.in/jisti/home.html如果你想看看)

任何想法如何解決這個問題? o_o

+7

UTF8文件不應該有一個BOM,如果你的編輯把那些在,應該有省略這些配置中,如果你的編輯器將不允許你不放入BOM中,替換您的編輯器。 – 2012-04-24 02:11:14

+0

是的。我使用n ++,如果使用n ++,我嘗試不使用BOM – sheppardzw 2012-04-28 02:17:00

回答

93

你可以使用下面的代碼刪除UTF8 BOM

//Remove UTF8 Bom 

function remove_utf8_bom($text) 
{ 
    $bom = pack('H*','EFBBBF'); 
    $text = preg_replace("/^$bom/", '', $text); 
    return $text; 
} 
+0

這個爲我工作。 – 2013-10-11 15:56:09

+0

嘗試了很多解決方案,但這個工作。謝謝! – nijlgier 2014-06-11 10:16:41

+0

出於某種原因,在Google+ API中,此BOM顯示在內容變量的末尾,所以我需要調整它以將其從字符串末尾移除。 – 2017-03-02 18:08:13

4

b'\xef\xbb\xbf'代表文字字符串「\ xef \ xbb \ xbf」。如果你想檢查一個BOM,則需要用雙引號,所以\x序列實際上是解釋成字節:

"\xef\xbb\xbf" 

您的文件似乎也包含了很多的垃圾不僅僅是一個單一的領導BOM:

$ curl http://ircb.in/jisti/ | xxd 

0000000: efbb bfef bbbf efbb bfef bbbf efbb bfef ................ 
0000010: bbbf efbb bf3c 2144 4f43 5459 5045 2068 .....<!DOCTYPE h 
0000020: 746d 6c3e 0a3c 6874 6d6c 3e0a 3c68 6561 tml>.<html>.<hea 
... 
+0

,爲什麼會這樣呢?它將它保存爲unix/utf8 -bom – sheppardzw 2012-04-28 02:17:28

+0

將它另存爲UTF-8 NO BOM(或者其他所謂的N ++)。 – deceze 2012-04-28 02:26:21

+0

我做了,我仍然得到相同的結果。我curl'd直接文件(捲曲http://ircb.in/jisti/home.html | xxd)並沒有得到主角,但curl'ing PHP腳本增加了額外的數據在前面,我所有使用打印輸出數據。 – sheppardzw 2012-04-28 02:34:50

25

嘗試:

// -------- read the file-content ---- 
$str = file_get_contents($source_file); 

// -------- remove the utf-8 BOM ---- 
$str = str_replace("\xEF\xBB\xBF",'',$str); 

// -------- get the Object from JSON ---- 
$obj = json_decode($str); 

:)

+0

這個爲我做了竅門,感謝發佈這個解決方案! – Blaater 2014-06-17 07:19:04

+0

通常更容易。 :-) – Bondt 2015-07-24 08:49:44

6

的另一種方法,以除去BOM這對於UTF-8系統基礎字符集Unicode代碼點U + FEFF

$str = preg_replace('/\x{FEFF}/u', '', $file); 
2

此全局funtion決心。坦克!

function prepareCharset($str) { 

    // set default encode 
    mb_internal_encoding('UTF-8'); 

    // pre filter 
    if (empty($str)) { 
     return $str; 
    } 

    // get charset 
    $charset = mb_detect_encoding($str, array('ISO-8859-1', 'UTF-8', 'ASCII')); 

    if (stristr($charset, 'utf') || stristr($charset, 'iso')) { 
     $str = iconv('ISO-8859-1', 'UTF-8//TRANSLIT', utf8_decode($str)); 
    } else { 
     $str = mb_convert_encoding($str, 'UTF-8', 'UTF-8'); 
    } 

    // remove BOM 
    $str = urldecode(str_replace("%C2%81", '', urlencode($str))); 

    // prepare string 
    return $str; 
} 
1

一個額外的方法來完成同樣的工作:

function remove_utf8_bom_head($text) { 
    if(substr(bin2hex($text), 0, 6) === 'efbbbf') { 
     $text = substr($text, 3); 
    } 
    return $text; 
} 

我發現其他方法無法在我的情況下工作。

希望它在某些特殊情況下有所幫助。

1

如果你正在讀使用file_get_contents一些API,並得到了json_decode一股莫名的NULL,檢查json_last_error()值:有時file_get_contents返回的值將有一個多餘的BOM,當你檢查字符串幾乎是無形的,但會使json_last_error()返回JSON_ERROR_SYNTAX(4)。

>>> $json = file_get_contents("http://api-guiaserv.seade.gov.br/v1/orgao/all"); 
=> "\t{"orgao":[{"Nome":"Tribunal de Justi\u00e7a","ID_Orgao":"59","Condicao":"1"}, ...]}" 
>>> json_decode($json); 
=> null 
>>> 

在這種情況下,檢查前3個字節 - 附和他們是不是非常有用,因爲BOM是大多數設置隱形:

>>> substr($json, 0, 3) 
=> " " 
>>> substr($json, 0, 3) == pack('H*','EFBBBF'); 
=> true 
>>> 

如果上述方法返回行真爲你,那麼簡單的測試可能會解決問題:

>>> json_decode($json[0] == "{" ? $json : substr($json, 3)) 
=> {#204 
    +"orgao": [ 
     {#203 
     +"Nome": "Tribunal de Justiça", 
     +"ID_Orgao": "59", 
     +"Condicao": "1", 
     }, 
    ], 
    ... 
    } 
0

這可能有所幫助。讓我知道你是否關心我擴展我的思維過程。

<?php 
    // 
    // labled TESTINGSTRIPZ.php 
    // 

    define('CHARSET', 'UTF-8'); 

    $stringy = "\xef\xbb\xbf\"quoted text\" "; 
    $str_find_array = array("\xef\xbb\xbf"); 
    $str_replace_array = array(   ''); 


    $RESULT = 
     trim(
      mb_convert_encoding(

       str_replace(
        $str_find_array, 
        $str_replace_array, 
        strip_tags($stringy) 
        ), 

       'UTF-8', 

       mb_detect_encoding(
        strip_tags($stringy) 
        ) 

       ) 
      ); 

     print("YOUR RESULT IS: " . $RESULT.PHP_EOL); 

?> 

結果:

terminal$ php TESTINGSTRIPZ.php 
     YOUR RESULT IS: "quoted text" // < with no hidden char. 
相關問題