如何编码PHP中通过CURL获取的内容?

时间:2018-01-25 16:09:30

标签: php curl encoding utf-8

我有一个PHP脚本,它使用CURL来获取用户输入的URL的标题和描述,并在页面上显示它们(包括一个utf-8字符集元标记),我遇到的问题不是字符正确显示。

我在this answer中读到PHP CURL函数将字符串编码为utf-8,我需要用utf8_decode解码字符串。但我发现使用utf8_decode是一个命中或错过命题 - 有时它会有所帮助,有时它会创建未知字符,在字符串被解码之前没有字符串。

我在下面列举了一些例子。

在这种情况下处理编码的正确方法是什么?

示例:

以下是在说明中使用emdash从a NY Times article获取的内容。在这种情况下,解码版本会正确显示字符:

enter image description here

以下是来自another NY Times article的内容以及描述中的emdash,此处解码使得字符显示不正确:

enter image description here

我发现解码会导致西班牙语this one等外语网站出现问题:

enter image description here

我知道我可以检测到URL的语言并根据它进行解码,但是我找到了很多英文网站,其中编码会导致问题,例如this one

enter image description here

2 个答案:

答案 0 :(得分:0)

服务器将强制执行页面编码,您必须根据它进行解码。您可以提前获取页面编码发出HEAD请求。在charset标题

处查找Content-type

curl --head https://www.nytimes.com/ HTTP/1.1 200 OK Server: Apache Cache-Control: no-cache X-ESI: 1 X-App-Response-Time: 0.70 Content-Type: text/html; charset=utf-8 X-PageType: homepage ... ...
Vary: Accept-Encoding, Fastly-SSL

答案 1 :(得分:0)

在做了更多的实验之后,我偶然发现了this solution,它解决了所有问题。

我的脚本获取了URL内容并将它们加载到这样的DOM文档中:

$html = file_get_contents_curl($link_url);
$doc = new DOMDocument();
@$doc->loadHTML($html);

根据链接的文章,我将其更改为:

$html = file_get_contents_curl($link_url);
$doc = new DOMDocument();
@$doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));

我也没有使用utf8_decode。

一切都正常显示。