file_get_contents не работает с utf8 - PullRequest
       16

file_get_contents не работает с utf8

1 голос
/ 07 февраля 2011

Я пытаюсь получить тайские символы с веб-сайта. Я пробовал:

$rawChapter = file_get_contents("URL");
$rawChapter = mb_convert_encoding($rawChapter, 'UTF-8', mb_detect_encoding($rawChapter, 'UTF-8, ISO-8859-1', true));

Когда я делаю это, персонажи возвращаются как:

¡ÅѺ˹éÒáá¾ÃФÑÁÀÕÃìÀÒÉÒä ·  © ºÑº

Но если я возьму исходный код страницы, которую пытаюсь загрузить, и сохраню ее в своем собственном файле .htm на моем локальном хосте в виде файла utf8, тогда он правильно загрузит тайские символы. Только когда я пытаюсь загрузить его с сайта напрямую, он ломается.

Как я могу это исправить? В чем может быть проблема?

Я также пытался добавить этот контекст:

$context = stream_context_create(array(
            'http' => array(
                'method' => 'POST',
                'header' => implode("\r\n", array(
                    'Content-type: application/x-www-form-urlencoded',
                    'Accept-Language: en-us,en;q=0.5',
                    'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7'
                ))
            )
        ));

Я пытался добавить его в одиночку, я пытался добавить его с помощью mb_convert_encoding () ... Мне кажется, что я перепробовал все комбинации этого материала и безуспешно.

1 Ответ

2 голосов
/ 07 февраля 2011

Измените Accept-Charset на UTF-8, потому что ISO-8859-1 не поддерживает тайские символы.Если вы выполняете свой PHP-скрипт на компьютере с Windows, вы также можете использовать кодировку windows-874, и вы также можете попробовать добавить этот заголовок:

Content-Language: th

Но в большинстве случаев UTF-8 будет обрабатыватьпочти все символы или наборы символов без какого-либо другого объявления.

** ОБНОВЛЕНИЕ **

Очень странно, но это работает для меня.

$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=> implode("\r\n", array(
                   'Content-type: text/plain; charset=TIS-620'
                   //'Content-type: text/plain; charset=windows-874'  // same thing
                ))
  )
);

$context = stream_context_create($opts);

//$fp = fopen('http://thaipope.org/webbible/01_002.htm', 'rb', false, $context);
//$contents = stream_get_contents($fp);
//fclose($fp);
$contents = file_get_contents("http://thaipope.org/webbible/01_002.htm",false, $context);

header('Content-type: text/html; charset=TIS-620');
//header('Content-type: text/html; charset=windows-874');  // same thing

echo $contents;

Видимо, я ошибся в этом из-за UTF-8.Смотрите здесь для более подробной информации.Хотя у вас все еще может быть выход UTF-8:

$in_charset = 'TIS-620';   // == 'windows-874'
$out_charset = 'utf-8';

$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=> implode("\r\n", array(
                   'Content-type: text/plain; charset=' . $in_charset
                ))
  )
);

$context = stream_context_create($opts);

$contents = file_get_contents("http://thaipope.org/webbible/01_002.htm",false, $context);
if ($in_charset != $out_charset) {
    $contents = iconv($in_charset, $out_charset, $contents);
}

header('Content-type: text/html; charset=' . $out_charset);

echo $contents;   // output in UTF-8
...