Функция PHP fread (), возвращающая дополнительные символы в текстовые файлы UTF-8 - PullRequest
1 голос
/ 03 февраля 2012

Хотя я использую fread() в обычном текстовом файле (например, ANSI-файл обычно сохраняется в Блокноте), как и всем известно, возвращаемая строка содержимого верна.

Но когда я читаю текстовый файл UTF-8, возвращаемая строка содержимого содержит невидимых символов (спереди). Я сказал, что невидимый состоит в том, что дополнительные символы не могут нормально отображаться на выходе (например, echo для только что прочитанного). Но когда для обработки используется строка содержимого (например: Создать ссылку со значением href), тогда возникает проблема.

$filename = "blabla.txt";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
echo '<a href="'.$contents.'">'.$contents.'</a>';

Я поместил только http://www.google.com в текстовый файл кодировки UTF-8. Запустив файл PHP, вы увидите выходную ссылку http://www.google.com
... но вы никогда не достигнете Google.

Поскольку источник адреса href выглядит следующим образом:

%EF%BB%BFhttp://www.google.com

Это значит, fread добавлено %EF%BB%BF странных символов спереди.

Это очень раздражающий материал. Почему это происходит?

Добавлено:
Некоторые указывают, что это спецификация. Итак, спецификация или что-то еще, это меняет мои первоначальные значения. Так что теперь, это проблема с другими шагами, вызовами функций и т. Д. Теперь мне нужно substr($string,3) для всех выходов. Это совершенно бессмысленно менять исходные значения.

Ответы [ 2 ]

3 голосов
/ 03 февраля 2012

Это называется спецификацией UTF-8. Пожалуйста, обратитесь к http://en.wikipedia.org/wiki/Byte_order_mark

Это то, что необязательно добавляется в начало файлов Utf-8, то есть оно находится в файле, а не что-то, что добавляет фред. Большинство текстовых редакторов не отображают спецификацию, но некоторые - в основном те, которые ее не понимают. Не все редакторы добавят его в файлы Utf-8, но некоторые снова ...

Для Utf-8 использование спецификации не рекомендуется, поскольку оно не имеет смысла и во многих случаях не понимается.

2 голосов
/ 03 февраля 2012

Это UTF-8 BOM. Если вы посмотрите документы для фреда ( здесь ), кто-то обсуждал решение для этого.

Ниже приведено решение

// 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;
} 
...