fgets UTF-8 txt文件返回垃圾字母,如果文件为空白,则返回true

时间:2019-02-26 08:56:04

标签: php file

我认为这是由于UTF-8 txt文件格式引起的。 txt文件完全是空的,当我尝试fgets($file_handle)时,我得到了这些垃圾字母:

These weird letters

该如何解决?我想使用以下方法检查文件是否为空:

if ( !$file_data = fgets($file_handle) )
    // This code runs if file is empty

编辑

这是一个使用UTF-8编码的新文件:

New File

1 个答案:

答案 0 :(得分:2)

这与记事本添加的BOM(Byte Order Mark)有关,以检测编码:

  

Microsoft编译器和解释器以及Microsoft Windows上的许多软件(例如记事本)将BOM视为必需的幻数,而不是使用启发式。这些工具在将文本另存为UTF-8时添加BOM,并且除非存在BOM或文件中仅包含ASCII,否则它们无法解释UTF-8。将文档转换为纯文本文件以供下载时,Google Docs还添加了BOM。

从本文中您还可以看到:

  

BOM的UTF-8表示形式是(十六进制)字节序列0xEF,0xBB,0xBF

因此,我们应该能够编写一个PHP函数来解决此问题:

function is_utf8_file_empty($filename)
{
    $file = @fopen($filename, "r");
    $bom  = fread($file, filesize($filename));

    if ($bom == b"\xEF\xBB\xBF") {
        return true;
    }

    return false;
}

请注意,这特定于以您描述的方式创建的文件,并且这只是示例代码-您绝对应该对其进行测试并可以对其进行修改,以使其能够更好地处理大文件/完全为空的文件等< / p>