2012-04-24 18 views
39

Używanie PHP5 (cgi) do wyprowadzania plików szablonów z systemu plików i problemów z wypuszczaniem surowego HTML.Jak usunąć wiele sekwencji BOM UTF-8 przed "<!DOCTYPE>"?

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; 
} 

Nawet Dodałem poprawkę BOM ciągle mam problemy z Firefoksem przyjęciem. Możesz zobaczyć kopię na żywo tutaj: http://ircb.in/jisti/ (i plik szablonu, który wyrzuciłem pod http://ircb.in/jisti/home.html, jeśli chcesz to sprawdzić)

Każdy pomysł, jak to naprawić? o_o

+7

plik utf8 nie powinien mieć BOM, jeśli redaktor umieścić w tym, nie powinno być konfiguracja pominąć te, jeśli redaktor nie pozwoli Ci nie umieść w BOM, zastąp swojego edytora. –

+0

tak. Używam n ++ i próbowałem bez BOM – sheppardzw

Odpowiedz

93

należałoby użyć następującego kodu do usunięcia utf8 Bom

//Remove UTF8 Bom 

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

Ten pracował dla mnie. –

+0

Wypróbowałem wiele rozwiązań, ale ten działał. Dzięki! – nijlgier

+0

Z jakiegoś powodu w interfejsie API Google+ ta lista materiałowa pojawia się na końcu zmiennej treści, więc musiałem ją poprawić, aby usunąć ją z końca ciągu. –

4

b'\xef\xbb\xbf' oznacza dosłowny ciąg "\ xef \ xbb \ xbf". Jeśli chcesz sprawdzić, BOM, trzeba użyć cudzysłowów, więc sekwencje \x są właściwie interpretowane w bajtach:

"\xef\xbb\xbf" 

Pliki również wydają się zawierać o wiele więcej śmieci niż tylko jednego prowadzącego 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

, jeśli używałem n ++, dlaczego spowodowałoby to? to zapisywanie go jako unix/utf8 -bom – sheppardzw

+0

Zapisz jako UTF-8 NO BOM (lub jakkolwiek to się nazywa w N ++). – deceze

+0

Zrobiłem i nadal otrzymuję taki sam wynik. Znalazłem bezpośredni plik (curl http://ircb.in/jisti/home.html | xxd) i nie otrzymałem żadnych znaków wiodących, ale zwijanie skryptu PHP dodaje nadmiar danych z przodu i wszystko co mam using to print, aby wyprowadzić dane. – sheppardzw

25

try:

// -------- 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

To mi się udało, dzięki za opublikowanie tego rozwiązania! – Blaater

+0

Często jest to łatwiejsze. :-) – Bondt

6

Innym sposobem na usunięcie LM, która jest punkt kodowy Unicode U + FEFF

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

Ten globalny resolve funtion dla UTF-8 bazowego systemu kodowania. Czołgi!

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

Dodatkowy sposób zrobić to samo zadanie:

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

Inne metody znalazłem nie działa w moim przypadku.

Mam nadzieję, że pomaga w niektórych szczególnych przypadkach.

1

Jeśli czytasz jakieś API korzystając file_get_contents i dostał niewytłumaczalny NULL z json_decode, sprawdzić wartość json_last_error(): czasami wartość zwracana z file_get_contents będą miały obcych BOM, który jest prawie niewidoczny, gdy sprawdzać ciąg, ale uczyni json_last_error() do zwrócenia 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 
>>> 

W tym przypadku należy sprawdzić pierwsze 3 bajty - ich echa nie jest bardzo użyteczne, ponieważ BOM jest niewidoczny na większości ustawień:

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

Jeśli linia powyżej Zwraca TRUE dla Ciebie, a następnie prosty test może rozwiązać ten problem:

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

To może pomóc. daj mi znać, jeśli zależy ci na rozszerzeniu mojego procesu myślowego.

<?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); 

?> 

Wynik:

terminal$ php TESTINGSTRIPZ.php 
     YOUR RESULT IS: "quoted text" // < with no hidden char. 
Powiązane problemy