如何使用 PHP 读取 UTF8+BOM 文件而不让 BOM 显示为内容?
How to read in UTF8+BOM file using PHP and not have the BOM appear as content?
问题的意思差不多。我发现了很多关于如何在读入文本后去除字节顺序标记的建议,但这似乎是错误的。在正确识别和处理 BOM 的情况下,在 Unicode 文件中是否有一种标准的语言读取方式?
没有。您必须手动完成。
BOM 是 UTF-16LE 和 UTF-16BE 编码中信令字节顺序的一部分,因此 UTF-16 解码器自动删除它(很多人都这样做)是有道理的。
然而,UTF-8 始终具有相同的字节顺序,并且旨在实现 ASCII 兼容性,因此从未将 BOM 视为指定编码方案的一部分,因此实际上它不应该接收任何特殊的来自 UTF-8 解码器的处理。
UTF-8 faux-BOM 不是编码的一部分,而是一些(主要是 Microsoft)应用程序用来表示该文件可能是 UTF-8 的临时(并且有些争议)标记。它本身并不是一个标准,因此建立在 UTF-8 之上的规范,如 XML 和 JSON,必须对其进行特殊处理。
有同样的问题。我的函数 _fread() 将删除 bom 并解决了
我的问题...
/**
* Read local file
* @param file local filename
* @return Data from file, or false on failure
*/
function _fread ($file = null) {
if ( is_readable($file) ) {
if ( !($fh = fopen($file, 'r')) ) return false;
$data = fread($fh, filesize($file));
// remove bom
$bom = pack('H*','EFBBBF');
$data = preg_replace("/^$bom/", '', $data);
fclose($fh);
return $data;
}
return false;
}
问题的意思差不多。我发现了很多关于如何在读入文本后去除字节顺序标记的建议,但这似乎是错误的。在正确识别和处理 BOM 的情况下,在 Unicode 文件中是否有一种标准的语言读取方式?
没有。您必须手动完成。
BOM 是 UTF-16LE 和 UTF-16BE 编码中信令字节顺序的一部分,因此 UTF-16 解码器自动删除它(很多人都这样做)是有道理的。
然而,UTF-8 始终具有相同的字节顺序,并且旨在实现 ASCII 兼容性,因此从未将 BOM 视为指定编码方案的一部分,因此实际上它不应该接收任何特殊的来自 UTF-8 解码器的处理。
UTF-8 faux-BOM 不是编码的一部分,而是一些(主要是 Microsoft)应用程序用来表示该文件可能是 UTF-8 的临时(并且有些争议)标记。它本身并不是一个标准,因此建立在 UTF-8 之上的规范,如 XML 和 JSON,必须对其进行特殊处理。
有同样的问题。我的函数 _fread() 将删除 bom 并解决了 我的问题...
/**
* Read local file
* @param file local filename
* @return Data from file, or false on failure
*/
function _fread ($file = null) {
if ( is_readable($file) ) {
if ( !($fh = fopen($file, 'r')) ) return false;
$data = fread($fh, filesize($file));
// remove bom
$bom = pack('H*','EFBBBF');
$data = preg_replace("/^$bom/", '', $data);
fclose($fh);
return $data;
}
return false;
}