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

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

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
В чем проблема? Вероятно придется перейти на сокеты?
 

gerasim

Новичок
fread( $h, 8192 ) - второй аргумент - кол-во байтов, а не символов
длина документа в utf-8 больше, чем с cp1251 (в байтах)
cp1251 кодировка однобайтная, а утф - нет
 

tz-lom

Продвинутый новичок
gerasim
и как это может помочь?
KIRALEX
в принципе не правильно опираться на священное знание fread != '' , следует делать fread в цикле while(!feof($h)) ,
 

KIRALEX

Новичок
следует делать 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.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Вопросы воровства контента здесь не обсуждают
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху