2012-02-25 26 views
1

我刮了一些偶尔在标题中使用UTF-8字符的网站,但没有指定UTF-8作为字符集(qq.com是一个示例) 。当我在浏览器中查看网站时,我想要复制的数据(即标题)看起来正确(日文或中文..不太确定)。我可以复制标题并将其粘贴到终端中,看起来完全一样。我甚至可以将它写入数据库,当我从数据库中检索时,它看起来仍然是相同的,并且是正确的。Curl:使用不正确的字符集从网站获取UTF-8数据

但是,当我使用cURL时,打印的数据是错误的。我可以从命令行运行cURL或使用PHP ..当它被打印到终端时,它显然是不正确的,并且当我将它存储到数据库时仍然是这种方式(请记住:终端可以可以正确显示这些字符)。我试过以下的所有符合条件的组合:

  • 设置CURLOPT_BINARYTRANSFERtrue
  • mb_convert_encoding($html, 'UTF-8')
  • utf8_encode($html)
  • utf8_decode($html)

这些都不如预期显示的字符。这是非常令人沮丧的,因为我可以通过访问网站轻松获得正确的角色,但cURL不能。我已阅读了很多建议,例如:How to get web-page-title with CURL in PHP from web-sites of different CHARSET?

解决方案通常似乎是“将数据转换为UTF-8”。说实话,我实际上并不知道这意味着什么。上述函数不能将数据转换为UTF-8吗?为什么它不是UTF-8?它是什么,为什么它在某些情况下显示正确,但不适合cURL?

回答

4

你尝试过:

$html = iconv("gb2312","utf-8",$html);

gb2312从qq.com头拍摄

+0

我给这个一杆,但它好像如果我能得到它只会工作字符集。如果该网站根本没有字符集声明呢? – 2012-02-25 20:15:51

+0

这是正确的答案。你在'mb_convert_encoding'和'utf8_encode'的右边,但你没有指定源编码,所以它使用了(错误的)默认值。 – spencercw 2012-02-25 20:16:59

+0

@tandu一个常见的策略是查看它是否是有效的UTF-8。如果不是,则假定它是ISO-8859-1。如果没有明确地声明编码是什么,那么你可以做的事情不多,但应该尝试做出有根据的猜测。 – spencercw 2012-02-25 20:18:30