проблема кодировки php: file_get_contents - PullRequest
8 голосов
/ 03 апреля 2009

Моя задача проста: сделать запрос на translate.google.com и получить перевод. В следующем примере я использую слово «привет» для перевода на русский язык.

header('Content-Type: text/plain; charset=utf-8');  // optional
error_reporting(E_ALL | E_STRICT);

$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', // optional
            'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7' // optional
        )),
        'content' => http_build_query(array(
            'prev'  =>  '_t',
            'hl'    =>  'en',
            'ie'    =>  'UTF-8',
            'text'  =>  'hello',
            'sl'    =>  'en',
            'tl'    =>  'ru'
        ))
    )
));

$page = file_get_contents('http://translate.google.com/translate_t', false, $context);

require '../simplehtmldom/simple_html_dom.php';
$dom = str_get_html($page);
$translation = $dom->find('#result_box', 0)->plaintext;
echo $translation;

Строки, помеченные как необязательные, - это те, без которых вывод одинаков. Но я получаю странные персонажи ...

������

Я пытался

echo mb_convert_encoding($translation, 'UTF-8');

Но я получаю

ÐÒÉ×ÅÔ

Кто-нибудь знает, как решить эту проблему?

UPDATE:

  1. Забыл упомянуть, что все мои php файлы кодируются в UTF-8 без BOM
  2. Когда я меняю язык "на" на «en», то есть перевод с с английского на английский, работает нормально.
  3. Я не думаю, что библиотека, которую я использую, испортила ее, потому что я пыталась вывести всю страницу $, не передав ее функциям библиотеки.
  4. Я использую PHP 5

Ответы [ 3 ]

9 голосов
/ 03 апреля 2009

Прежде всего, ваш браузер настроен на UTF-8? В Firefox вы можете установить кодировку текста в View-> Character Encoding. Убедитесь, что у вас выбран «Unicode (UTF-8)». Я также хотел бы установить View-> Character Encoding-> Auto-Detect на «Универсальный».

Во-вторых, вы можете попробовать передать флаг FILE_TEXT, например:

$page = file_get_contents('http://translate.google.com/translate_t', FILE_TEXT, $context);
8 голосов
/ 03 апреля 2009

Попробуйте посмотреть этот пост, если он может помочь CURL импортировать проблему кодировки символов

Также вы можете попробовать этот фрагмент (взято с php.net)

<?php
function file_get_contents_utf8($fn) {
     $content = file_get_contents($fn);
      return mb_convert_encoding($content, 'UTF-8',
          mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true));
}
?>
1 голос
/ 03 апреля 2009

Accept-Charset не так уж и необязателен. Вы должны указать там UTF8. Русские символы недопустимы в ISO_8859-1

...