当我尝试在PHP中打开由游戏创建的.log文件时,我得到了一堆.
ÿþ*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*? ?
K?2? ?E?n?g?i?n?e? ?s?t?a?r?t? ?u?p?.?.?.? ?
[?2?0?0?9?/?2?2?/?0?9?]? ?
[?1?6?:?0?7?:?3?3?]? ?
[?0?.?1?.?4?6?.?0?]? ?
[?0?]? ?
Run Code Online (Sandbox Code Playgroud)
我不知道为什么?我的代码是
$file = trim($_GET['id']);
$handle = @fopen($file, "a+");
if ($handle) {
print "<table>";
while (!feof($handle)) {
$buffer = stream_get_line($handle, 10000, "\n");
echo "<tr><td width=10>" . __LINE__ . "</td><td>" . $buffer . "</td></tr>";
}
print "</table>";
fclose($handle);
Run Code Online (Sandbox Code Playgroud)
我正在使用,stream_get_line因为它对大文件显然更好?
PHP对编码并不是很了解.特别是,它对文件的编码一无所知.
数据看起来像UTF-16LE.因此,您需要将其转换为可以处理的内容 - 或者,因为您只是打印,所以您可以将整个脚本转换为输出其HTML为UTF-16LE.
我可能更喜欢转换为UTF-8并将其用作页面编码,因此您确定没有丢失任何字符.看看iconv,假设它可用(我相信Windows上需要PHP扩展).
请注意,无论您执行什么操作,都应该删除第一行的前两个字符,假设编码始终相同.在您显示的数据中,这些字符是字节顺序标记,它告诉我们文件的编码(UTF-16LE,就像我之前提到的那样).
但是,看看它看起来像是纯文本,而你正在做的就是打印数据,考虑只在普通的旧文本编辑器(支持Unicode)中打开它.不知道你的操作系统,我犹豫是否建议一个特定的操作系统,但如果你在Windows上,文件相对较小,记事本可以做到这一点.
作为旁注,__LINE__不会显示您正在读取的文件的行号,它将打印当前正在执行的脚本行的行号.