PHP文件打开编码问题?

时间:2009-09-22 22:50:10

标签: php encoding

当我尝试在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,因为它对大文件来说显然更好?

2 个答案:

答案 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;
}
?>

来自:http://us3.php.net/manual/en/function.fopen.php#78308