¿Cómo eliminar múltiples secuencias de BOM UTF-8 antes de “”?

Usando PHP5 (cgi) para sacar archivos de plantilla del sistema de archivos y tener problemas escupiendo HTML sin formato.

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

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

¿Algúna idea de cómo arreglar esto? o_o

usarías 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; } 

tratar:

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

🙂

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

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

b'\xef\xbb\xbf' representa la cadena literal “\ xef \ xbb \ xbf”. Si desea buscar una lista de materiales, debe usar comillas dobles, por lo que las secuencias \x realidad se interpretan en bytes:

 "\xef\xbb\xbf" 

Sus archivos también parecen contener mucha más basura que una sola lista de materiales líder:

 $ curl http://ircb.in/jisti/ | xxd 0000000: efbb bfef bbbf efbb bfef bbbf efbb bfef ................ 0000010: bbbf efbb bf3c 2144 4f43 5459 5045 2068 ....... 

Esta resolución de funtion global para chatset base del sistema UTF-8. 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; } 

Un método extra 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 encontré no pueden funcionar en mi caso.

Espero que ayude en algún caso especial.

Si está leyendo alguna API usando file_get_contents y obtuvo un NULL inexplicable de json_decode , verifique el valor de json_last_error() : a veces el valor devuelto por file_get_contents tendrá una lista de materiales extraña que es casi invisible cuando inspecciona la cadena, pero 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, verifique los primeros 3 bytes; repetirlos no es muy útil porque la lista de materiales es invisible en la mayoría de las configuraciones:

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

Si la línea de arriba muestra TRUE para usted, entonces una 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", }, ], ... } 

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

  

Resultado:

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