fgets一个UTF-8 txt文件返回垃圾字母,当文件为空时返回true

问题描述 投票:0回答:1

我假设这是由于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

php file
1个回答
2
投票

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

Microsoft编译器和解释器以及Microsoft Windows上的许多软件(如记事本)将BOM视为必需的幻数而不是使用启发式。这些工具在将文本保存为UTF-8时添加BOM,除非BOM存在或文件仅包含ASCII,否则无法解释UTF-8。在将文档转换为纯文本文件以供下载时,Google文档还会添加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;
}

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

© www.soinside.com 2019 - 2024. All rights reserved.