it-swarm.com.de

So entfernen Sie mehrere UTF-8-Stücklistenfolgen

Verwendung von PHP5 (cgi) zur Ausgabe von Vorlagendateien aus dem Dateisystem und Probleme mit dem Ausspülen von HTML-Code.

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

Obwohl ich den BOM-Fix hinzugefügt habe, habe ich immer noch Probleme mit der Annahme durch Firefox. Eine Live-Kopie finden Sie hier: http://ircb.in/jisti/ (und die Vorlagendatei, die ich unter http://ircb.in/jisti/home.html warf, wenn Sie möchten es prüfen)

Irgendeine Idee, wie man das beheben kann? o_o

42
sheppardzw

sie würden den folgenden Code verwenden, um utf8 bom zu entfernen

//Remove UTF8 Bom

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

versuchen: 

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

:)

31
o1max

Eine andere Möglichkeit, die Stückliste zu entfernen, ist der Unicode-Codepunkt U + FEFF

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

b'\xef\xbb\xbf' steht für die Literalzeichenfolge "\ xef\xbb\xbf". Wenn Sie nach einer Stückliste suchen möchten, müssen Sie doppelte Anführungszeichen verwenden, sodass die \x-Sequenzen tatsächlich in Bytes interpretiert werden:

"\xef\xbb\xbf"

Ihre Dateien scheinen auch viel mehr Müll zu enthalten als nur eine führende Stückliste:

$ 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
...
7
deceze

Diese globale Funktion wird für UTF-8-System-Basiszeichensatz aufgelöst. Panzer

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;
}
4
Patrick Otto

wenn jemand den csv-Import verwendet, ist der folgende Code nützlich

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

Eine zusätzliche Methode, um dieselbe Arbeit zu erledigen:

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

Die anderen Methoden, die ich gefunden habe, können in meinem Fall nicht funktionieren.

Hoffe, es hilft in einem speziellen Fall.

1
Alfred Huang

Wenn Sie eine API mit file_get_contents lesen und eine unerklärliche NULL von json_decode erhalten haben, überprüfen Sie den Wert von json_last_error(): Manchmal enthält der von file_get_contents zurückgegebene Wert eine überflüssige Stückliste, die fast unsichtbar ist, wenn Sie die Zeichenfolge überprüfen, jedoch json_last_error() zur Rückgabe von 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
>>>

Überprüfen Sie in diesem Fall die ersten 3 Bytes. Das Echo dieser Werte ist nicht sehr nützlich, da die Stückliste bei den meisten Einstellungen nicht sichtbar ist:

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

Wenn die Zeile oben für Sie WAHR ergibt, kann das Problem durch einen einfachen Test behoben werden:

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

Eine Lösung ohne pack-Funktion:

$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"
0
ktran

Das könnte helfen. lassen Sie es mich wissen, wenn Sie sich dafür interessieren, dass ich meinen Denkprozess erweitern kann.

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

?>

Ergebnis:

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

Bei fehlerhafter Software kommt es vor, dass der Stücklistenteil mit jeder Speicherung multipliziert wird.

Also benutze ich das, um es loszuwerden.

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

}

0
Juergen