php - php如何在"<DOCTYPE>"之前删除多个 utf 8 BOM序列?!

  显示原文与译文双语对照的内容

使用( 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'xefxbbxbf') {


 $t = substr($t, 3);


 }


 return $t;


}



尽管我已经添加了BOM修正,但 Firefox 接受它仍然存在问题。 你可以在这里看到现场副本: 如果你想检查的话,我将在 http://ircb.in/jisti/ ( 以及在 http://ircb.in/jisti/home.html 中抛出的模板文件)

知道怎么修复这个问题? O_o

时间: 原作者:

你将使用以下代码删除 utf8 bom


//Remove UTF8 Bom



function remove_utf8_bom($text)


{


 $bom = pack('H*','EFBBBF');


 $text = preg_replace("/^$bom/", '', $text);


 return $text;


}



尝试以下方法:


//-------- read the file-content ----


$str = file_get_contents($source_file); 



//-------- remove the utf-8 BOM ----


$str = str_replace("xEFxBBxBF",'',$str); 



//-------- get the Object from JSON ---- 


$obj = json_decode($str); 



: )

另一种删除BOM的方法是Unicode代码点 U+FEFF


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



b'xefxbbxbf' 代表文本字符串"xefxbbxbf"。 如果要检查 BOM,则需要使用双引号,因此 x 序列实际上被解释为字节:

 
"xefxbbxbf"



 

你的文件似乎包含了比单一的主要物料清单更多的垃圾:


$ 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


...



原作者:

基于 UTF-8 系统基本字符集的全局函数解析。 坦克 !


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;


}



执行相同作业的额外方法:


function remove_utf8_bom_head($text) {


 if(substr(bin2hex($text), 0, 6) === 'efbbbf') {


 $text = substr($text, 3);


 }


 return $text;


}



我发现的其他方法在我的案例中无法工作。

希望对某些特殊情况有所帮助。

原作者:
...