PHP:file_get_contents编码问题

8
我的任务很简单:向 translate.google.com 发送一个 POST 请求并获取翻译。 在下面的例子中,我使用单词 "hello" 来进行俄语翻译。
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');

但我得到

ÐÒÉ×ÅÔ

有人知道如何解决这个问题吗?

更新:

  1. 忘记提到我的所有php文件都是以UTF-8编码而没有BOM。
  2. 当我将“to”语言更改为“en”,即从英语翻译成英语时,它可以正常工作。
  3. 我不认为我使用的库会搞砸它,因为我尝试输出整个$page而不将其传递给库函数。
  4. 我正在使用PHP 5。

如果您直接打印输出 $page,字符串仍然会乱码吗? - Manos Dilaverakis
把以下與編程相關的內容從英文翻譯成中文。只返回翻譯過的文字:不要出現亂碼。 - Jamol
看起来你正在使用的外部库(simple_html_dom)搞砸了。要么它写得很糟糕,要么在他们的API中有一个选项可以解决这个问题。你可能想把这个信息添加到你的问题中。 - Manos Dilaverakis
我认为我使用的库没有搞砸它,因为我尝试输出整个$page而不将其传递给库函数。 - Jamol
3个回答

10

尝试查看此帖子以查看是否可以帮助您解决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));
}
?>

是的,我已经尝试过了,它的输出与我问题中的第二个输出相同。 - Jamol
这对我有效,谢谢。 我知道我的文件是以ISO-8859-1编码的,因为我在Chrome中将文件名放入并查看了标题,编码在那里。 此外,在调用file_get_contents后立即打印$http_response_header,您也可以看到编码。 - santiago arizti

9

首先,您的浏览器是否设置为UTF-8?在Firefox中,您可以在“查看”->“字符编码”中设置文本编码。确保选择了“Unicode(UTF-8)”。我还会将“查看”->“字符编码”->“自动检测”设置为“通用”。

其次,您可以尝试传递FILE_TEXT标志,如下所示:

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

1

Accept-Charset并不是真正的可选项。你应该在那里指定UTF8。俄语字符在ISO_8859-1中无效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接