当我尝试在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�]� �
我不知道为什么?我的代码是
$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);
我正在使用stream_get_line
,因为它对大文件来说显然更好?
答案 0 :(得分:7)
PHP对编码并不是很了解。特别是,它对文件的编码一无所知。
数据看起来像UTF-16LE。所以你需要把它转换成你可以处理的东西 - 或者,因为你只是打印,你可以转换整个脚本以输出它的HTML也是UTF-16LE。
我可能更喜欢转换为UTF-8并将其用作页面编码,因此您确定没有丢失任何字符。看看iconv,假设它可用(我相信在Windows上需要PHP扩展)。
请注意,无论您做什么,都应该删除第一行的前两个字符,假设编码始终相同。在您显示的数据中,这些字符是字节顺序标记,它告诉我们文件的编码(UTF-16LE,就像我之前提到的那样)。
但是,看看它看起来像是纯文本,而你正在做的就是打印数据,考虑在普通的旧文本编辑器(支持Unicode)中打开它。不知道你的操作系统,我对建议一个特定的操作系统犹豫不决,但是如果你在Windows上并且文件相对较小,那么Notepad就可以做到。
作为旁注,__LINE__
不会显示您正在阅读的文件的行号,它将打印当前正在执行的脚本行的行号。
答案 1 :(得分:1)
您可能遇到了UTF-8字节顺序标记:http://en.wikipedia.org/wiki/Byte-order_mark 试着这样读:
<?php
// Reads past the UTF-8 bom if it is there.
function fopen_utf8 ($filename, $mode) {
$file = @fopen($filename, $mode);
$bom = fread($file, 3);
if ($bom != b"\xEF\xBB\xBF")
rewind($file, 0);
else
echo "bom found!\n";
return $file;
}
?>