Проблема с кодировкой открытия файла PHP? - PullRequest
0 голосов
/ 23 сентября 2009

Когда я пытаюсь открыть файл .log, созданный игрой на PHP, я получаю кучу этого.

ÿþ*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*� �
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 ]

7 голосов
/ 23 сентября 2009

PHP мало что знает о кодировках. В частности, он ничего не знает о кодировке вашего файла.

Данные выглядят как UTF-16LE. поэтому вам нужно преобразовать это во что-то, с чем вы можете справиться - или, поскольку вы просто печатаете, вы можете преобразовать весь скрипт, чтобы вывести его HTML также как UTF-16LE.

Я бы, вероятно, предпочел бы преобразовать в UTF-8 и использовать его в качестве кодировки страницы, так что вы точно не потеряете ни одного символа. Взгляните на iconv , предполагая, что он доступен (я думаю, для Windows требуется расширение PHP).

Обратите внимание, что независимо от того, что вы делаете, вы должны удалить первые два символа первой строки, предполагая, что кодировка всегда одинакова. В данных, которые вы показываете, эти символы являются меткой порядка байтов, которая сообщает нам кодировку файла (UTF-16LE, как я упоминал ранее).

Однако, учитывая то, что он выглядит как простой текст, и все, что вы делаете, - это распечатываете данные, просто откройте их в простом старом текстовом редакторе (который поддерживает Unicode). Не зная вашей операционной системы, я не решаюсь предложить конкретную, но если у вас Windows, а файл относительно небольшой, Блокнот может это сделать.

В качестве примечания, __LINE__ не даст вам номер строки файла, который вы читаете, он напечатает номер строки текущей исполняемой строки скрипта.

1 голос
/ 23 сентября 2009

Возможно, вы столкнулись с меткой порядка байтов 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...