PHP загружает только половину удаленной странички в UTF8

  • Автор темы Автор темы KIRALEX
  • Дата начала Дата начала
Статус
В этой теме нельзя размещать новые ответы.

KIRALEX

Новичок
Добрый день.
Я хочу загрузить по URL файл в UTF8 кодировке для дальнейшей обработки на сервере.
Банально пытаюсь открыть открыть URL и на выходе получаю только половину файла.
Если удаленный файл в кодировке CP1251 то проблемы не возникает.
PHP:
<?php
error_reporting( E_ALL );
$h = fopen( 'http://example.com', 'r' );

$file = '';

while ( ($buf = fread( $h, 8192 )) != '' )
{
    $file .= $buf;
}

fclose($h);

echo $file;
?>
PHP:
<?php
error_reporting( E_ALL );
$file = file_get_contents( 'http://example.com' );
echo $file;
?>

Использую PHP CLI 5.3.3 под Windows
В чем проблема? Вероятно придется перейти на сокеты?
 
fread( $h, 8192 ) - второй аргумент - кол-во байтов, а не символов
длина документа в utf-8 больше, чем с cp1251 (в байтах)
cp1251 кодировка однобайтная, а утф - нет
 
gerasim
и как это может помочь?
KIRALEX
в принципе не правильно опираться на священное знание fread != '' , следует делать fread в цикле while(!feof($h)) ,
 
следует делать fread в цикле while(!feof($h)) ,
Эффект тотже самый данные выгружаются не до конца.

fread( $h, 8192 ) - второй аргумент - кол-во байтов, а не символов
длина документа в utf-8 больше, чем с cp1251 (в байтах)
cp1251 кодировка однобайтная, а утф - нет
Что собственно логически вытекает, вероятно вебсервер выдает Content-Legth в символах UTF8 коих фактически в два раза меньше количества байт, а послушный fopen считает что это количество байт.

Веб браузер обрабатывает такую страничку правильно.


Собственно такой код выдает точно такойже результат, получаем половину файла.
Причем размер загруженных данных не зависит от количества этих данных, отдается примерно половина.
PHP:
<?php
error_reporting( E_ALL );

$h = fopen( 'http://example.com', 'rb' ); // r тоже самое

$file = '';

while (!feof($h)) {
  $file .= fgets($h);
}

fclose($h);

echo $file;
?>

Возможно нужно создать особенных $context со словами вроде Accept-Charsets: Windows-1251 но я не уверен что сервер отдаст именно CP1251.
 
Вопросы воровства контента здесь не обсуждают
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху