68

PHP5 (cgi) を使用してファイルシステムからテンプレート ファイルを出力し、未加工の 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;
}

BOM 修正を追加したにもかかわらず、Firefox がそれを受け入れるのにまだ問題があります。ここでライブ コピーを見ることができます: http://ircb.in/jisti/ (チェックアウトしたい場合は、私が投げたテンプレート ファイルhttp://ircb.in/jisti/home.html )

これを修正する方法はありますか?o_o

4

11 に答える 11

166

次のコードを使用して、utf8 bom を削除します。

//Remove UTF8 Bom

function remove_utf8_bom($text)
{
    $bom = pack('H*','EFBBBF');
    $text = preg_replace("/^$bom/", '', $text);
    return $text;
}
于 2013-03-15T02:55:00.910 に答える
49

試す:

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

:)

于 2013-09-18T11:19:03.210 に答える
8

b'\xef\xbb\xbf'リテラル文字列「\xef\xbb\xbf」を表します。BOM を確認する場合は、二重引用符を使用する必要があるため、\xシーケンスは実際にはバイトに解釈されます。

"\xef\xbb\xbf"

ファイルには、先頭の 1 つの 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
...
于 2012-04-24T02:07:43.993 に答える
3

機能のないソリューションpack:

$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"
于 2019-02-18T09:06:50.633 に答える
0

欠陥のあるソフトウェアを使用している場合、保存するたびに BOM 部分が増加することがあります。

なので、これを使って解消しています。

function remove_utf8_bom($text) {
    $bom = pack('H*','EFBBBF');
    while (preg_match("/^$bom/", $text)) {
        $text = preg_replace("/^$bom/", '', $text);
    }
    return $text;
}
于 2019-06-09T08:49:02.670 に答える