如何使用PHP读取UTF8 + BOM文件而不将BOM显示为内容?

时间:2015-01-31 05:28:53

标签: php unicode utf-8

问题所在。我已经找到了很多关于如何在读入文本时去除字节顺序标记的建议,但这似乎是错误的。是否有一种标准的语言方式可以读取Unicode文件并正确识别和处理BOM?

2 个答案:

答案 0 :(得分:1)

不。你必须手动完成。

BOM是UTF-16LE和UTF-16BE编码中信令字节顺序的一部分,因此UTF-16解码器自动删除它有很多意义(很多人都这样做。)

然而,UTF-8始终具有相同的字节顺序,并且旨在实现ASCII兼容性,因此包括BOM从未被设想为指定的编码方案的一部分,因此实际上它不应该接受任何特殊处理UTF-8解码器。

UTF-8虚假BOM不是编码的一部分,而是一些(主要是微软)应用程序用来表示该文件可能是UTF-8的临时(并且有些争议)标记。它本身并不是一个标准,所以基于UTF-8的规范,如XML和JSON,必须为它做出特殊的分配。

答案 1 :(得分:1)

有同样的问题。我的函数_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;
}
相关问题