Cómo quitar varias UTF-8 lista de materiales secuencias

Usando PHP5 (cgi) para la salida de archivos de plantilla desde el sistema de archivos y a tener problemas de escupir raw HTML.

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 yo hemos añadido la lista de materiales revisión aún estoy teniendo problemas con Firefox aceptarlo. Usted puede ver una copia directo aquí: http://ircb.in/jisti/ (y el archivo de plantilla me tiró en http://ircb.in/jisti/home.html si quieres echarle un vistazo a)

Alguna idea de cómo solucionar este problema? o_o

  • utf8 archivo no debe tener una lista de materiales, si su editor de poner esos, no debe ser una configuración para omitirlos, si el editor no te permite no poner en la lista de materiales, reemplazar su editor.
  • sí. Yo uso n++, y he intentado sin BOM
InformationsquelleAutor sheppardzw | 2012-04-24

11 Kommentare

  1. 129

    se puede usar el siguiente código para quitar utf8 bom

    //Remove UTF8 Bom
    
    function remove_utf8_bom($text)
    {
        $bom = pack('H*','EFBBBF');
        $text = preg_replace("/^$bom/", '', $text);
        return $text;
    }
    • Este trabajó para mí.
    • Intentado muchas soluciones, pero esta trabajado. Gracias!
    • Por alguna razón en el Google+ API, esta lista de materiales muestra al final del contenido de la variable, por lo que necesitaba para modificar este para eliminarlo desde el final de la cadena.
    • Puede alguien explicar cómo el pack función se utiliza aquí? Sé que convierte una cadena a una representación binaria, pero tratando de entender cómo esto ayuda con la identificación de la lista de materiales de caracteres Unicode.
    • Esto funcionó muy bien para mis requisito de leer el CSV de salida de SSRS y anexar a un archivo más grande.
    • Por último una lista de materiales de escape de la técnica que realmente funciona, Gracias!

  2. 32

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

    🙂

    • Esto lo hizo el truco para mí, gracias por publicar esta solución!
    • A menudo la más fácil. 🙂
  3. 13

    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);
  4. 7

    b'\xef\xbb\xbf' representa el literal de cadena «\xef\xbb\xbf». Si se desea comprobar una lista de materiales, es necesario utilizar comillas dobles, por lo que el \x secuencias son en realidad interpretan en bytes:

    "\xef\xbb\xbf"

    Los archivos también parecen contener mucha más basura que sólo un líder en la lista de materiales:

    $ 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
    ...
    • si estaba usando n++, ¿por qué iba a causar esto? es guardarlo como unix/utf8 -bom
    • Guardar como UTF-8 SIN BOM (o lo que se llama en N++).
    • Yo lo hice y sigo obteniendo el mismo resultado. Me rizo el archivo directa (curl ircb.in/jisti/home.html | xxd) y no obtuve personajes principales, pero curl ing PHP script agrega el exceso de datos en la parte delantera y todo lo que estoy usando es de impresión para la salida de los datos.
  5. 4

    Este global de la función de resolver para UTF-8 base del sistema de juego de caracteres. Los 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;
    }
  6. 3

    si alguien mediante la importación de csv entonces a continuación el código útil

               $header = fgetcsv($handle);
                foreach($header as $key=> $val) {
                    $bom = pack('H*','EFBBBF');
                    $val = preg_replace("/^$bom/", '', $val);
                    $header[$key] = $val;
                }
  7. 1

    Un extra método 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 funcionan en mi caso.

    Espero que ayude en algún caso especial.

  8. 1

    Si usted está leyendo algunas API utilizando file_get_contents y consiguió una inexplicable NULL de json_decode, compruebe el valor de json_last_error(): a veces, el valor devuelto desde file_get_contents tendrá una extraña lista de materiales que es casi invisible cuando inspeccione la cadena, sino que hará json_last_error() para volver 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 ellos no es muy útil porque 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 TRUE para usted, a continuación, una prueba sencilla que se 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",
           },
         ],
         ...
       }
  9. 1

    Una solución sin pack función:

    $a = "1";
    var_dump($a); //string(4) "1"
    
    function deleteBom($text)
    {
        return preg_replace("/^\xEF\xBB\xBF/", '', $text);
    }
    
    var_dump(deleteBom($a)); //string(1) "1"
  10. 0

    Esto podría ayudar. déjeme saber si usted se preocupa por mí para ampliar 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.
  11. 0

    Cuando se trabaja con software defectuoso sucede que el MOB parte se multiplica con cada ahorro.

    Así que estoy usando esto para deshacerse de él.

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

    }

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea