2012-04-24 6 views
39

Usando PHP5 (cgi) para sacar archivos de plantilla del sistema de archivos y tener problemas escupiendo HTML sin formato.Cómo eliminar múltiples secuencias de BOM UTF-8 antes de "<!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; 
} 

Aunque he agregado la solución BOM, sigo teniendo problemas con la aceptación de Firefox. Puede ver una copia en vivo aquí: http://ircb.in/jisti/ (y el archivo de plantilla que lancé al http://ircb.in/jisti/home.html si desea verificarlo)

¿Alguna idea de cómo solucionar esto? o_o

+7

archivo UTF-8 no debería tener una lista de materiales, si su editor de poner los de, no debe haber una configuración para omitir aquellos, si el editor no le permitirá no poner en lista de materiales, reemplace su editor. –

+0

sí. Uso n ++, y lo intenté sin BOM – sheppardzw

Respuesta

93

debe utilizar el siguiente código para eliminar UTF8 BOM

//Remove UTF8 Bom 

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

Éste trabajó para mí. –

+0

Intenté muchas soluciones, pero esta funcionó. ¡Gracias! – nijlgier

+0

Por alguna razón en la API de Google+, esta lista de materiales aparece al final de la variable de contenido, por lo que tuve que ajustarla para eliminarla del final de la cadena. –

4

b'\xef\xbb\xbf' representa la cadena literal "\ xef \ xbb \ xbf". Si desea comprobar si hay una lista de materiales, es necesario utilizar comillas dobles, por lo que los \x secuencias en realidad se interpretarán en bytes:

"\xef\xbb\xbf" 

Sus archivos también parecen contener mucha más basura que una simple lista de materiales que lleva:

$ 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

si estaba usando n ++, ¿por qué causaría esto? lo está guardando como unix/utf8 -bom – sheppardzw

+0

Guárdelo como UTF-8 SIN BOM (o como se llame en N ++). – deceze

+0

Lo hice y sigo obteniendo el mismo resultado. Hice una curva en el archivo directo (curl http://ircb.in/jisti/home.html | xxd) y no obtuve caracteres principales, pero curvar la secuencia de comandos PHP agrega el exceso de datos en el frente y todo lo que soy usar es imprimir para dar salida a los datos. – sheppardzw

25

intento:

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

¡Este me fue el truco, gracias por publicar esta solución! – Blaater

+0

A menudo el más fácil. :-) – Bondt

6

Otra manera de eliminar la lista de materiales que es punto de código Unicode U + FEFF

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

Esta determinación global para funtion juego de caracteres UTF-8 base del sistema. Tanques!

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

Un método adicional para hacer el mismo trabajo:

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

Los otros métodos que he encontrado no pueden trabajar en mi caso.

Espero que ayude en algún caso especial.

1

Si está leyendo alguna API usando file_get_contents y tiene un inexplicable NULL de json_decode, comprobar el valor de json_last_error(): a veces el valor devuelto por file_get_contents tendrá una lista de materiales superfluos que son casi invisibles cuando se inspecciona la cadena, sino que hará json_last_error() para devolver 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 
>>> 

En este caso, compruebe los 3 primeros bytes - haciéndose eco de ellas no es muy útil debido a que la lista de materiales es invisible en la mayoría de los ajustes:

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

Si la línea anterior Devuelve verdadero para que, a continuación, una la prueba simple puede solucionar el problema:

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

Esto podría ayudar. avíseme si le interesa que amplíe mi proceso de pensamiento.

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

?> 

Resultado:

terminal$ php TESTINGSTRIPZ.php 
     YOUR RESULT IS: "quoted text" // < with no hidden char. 
Cuestiones relacionadas