我有一个PHP脚本,它使用CURL来获取用户输入的URL的标题和描述,并在页面上显示它们(包括一个utf-8字符集元标记),我遇到的问题不是字符正确显示。
我在this answer中读到PHP CURL函数将字符串编码为utf-8,我需要用utf8_decode解码字符串。但我发现使用utf8_decode是一个命中或错过命题 - 有时它会有所帮助,有时它会创建未知字符,在字符串被解码之前没有字符串。
我在下面列举了一些例子。
在这种情况下处理编码的正确方法是什么?
示例:
以下是在说明中使用emdash从a NY Times article获取的内容。在这种情况下,解码版本会正确显示字符:
以下是来自another NY Times article的内容以及描述中的emdash,此处解码使得字符显示不正确:
我发现解码会导致西班牙语this one等外语网站出现问题:
我知道我可以检测到URL的语言并根据它进行解码,但是我找到了很多英文网站,其中编码会导致问题,例如this one:
答案 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。
一切都正常显示。