2009-09-22 3 views
0

Когда я пытаюсь открыть .log-файл, созданный игрой на PHP, я получаю кучу этого.Проблема с открытием файла 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, потому что это, по-видимому лучше для больших файлов?

+0

Что делает ваш .log файл выглядеть при просмотре с помощью текстового редактора? Можете ли вы опубликовать первые несколько строк? – Asaph

+3

, когда вы начинаете принимать ответы? – RRUZ

+0

Я могу открыть его в блокноте в порядке. И если я перейду в файл .log через веб-браузер, я справлюсь с ним. – Steven

ответ

7

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

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

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

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

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

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

1

Вы можете быть запущен в UTF-8 Byte Order Mark: 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

+3

Это не UTF -8, это UTF-16LE. Спецификация UTF-16LE находится прямо там в начале этих данных. –

Смежные вопросы