确定/转换外部 HTML 文件编码的最佳方法是什么?
我正在解析来自大约 100 个不同域的 HTML。我可以检查每个域使用的编码&那样做事情,但这似乎很愚蠢。
通常编码位于标头标签中,是吗?但我并不总是收集。所以我可能需要运行一些正则表达式?或使用一些 mb_ 函数。或者也许使用 cURL?到目前为止我找到的所有示例都是针对 XML 和 XML 的。现在我很头疼。
是的,我也使用 DOMDocument 类来查找我想要的内容。这一切都很好。除了编码之外。
I am parsing HTML from ~100 different domains. I could check what encoding each domain uses & do things that way, but that seems dumb.
Usually the encoding is in the header tags yeah? but not always I gather. so I may need to run some regex? or use some mb_ functions. Or perhaps use cURL? All the examples I've found so far are for XML & now I've got a headache.
Yes also I am using the DOMDocument class to find what I want. And that is all working great. Except for the encoding.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
根据 W3C 国际化标准,您应该遵循这些优先级,以便获取 HTML/XML 文档的编码:
Content-Type
标头(来自 HTTP 响应)meta
标记与http-equiv="Content-Type"
(来自 HTML 标头)根据我的经验,当所有这些都失败时,您可以假设编码很可能是 ISO-8859-1 或 CP1252。您可以使用 iconv 库解码内容,例如:
iconv("UTF-8", "ISO-8859-1", $content)
。如果您使用 cURL 库来获取 URL,则可以通过以下方式获取内容类型标头:
curl_getinfo($ch, CURLINFO_CONTENT_TYPE)
。其他标签可以使用 XML/HTML 解析器提取。According to the W3C internationalization standards, you should follow these priorities in order to get the encoding of an HTML/XML document:
Content-Type
header (from the HTTP response)<?xml version="1.0" encoding="utf-8" ?>
meta
tag withhttp-equiv="Content-Type"
(from the HTML header)In my experience, when all that fails, you can assume encoding is most probably ISO-8859-1 or CP1252. You can decode content using the iconv library, e.g.:
iconv("UTF-8", "ISO-8859-1", $content)
.If you use the cURL library to fetch the URLs, you can get the Content Type header with:
curl_getinfo($ch, CURLINFO_CONTENT_TYPE)
. The other tags can be extracted with an XML/HTML parser.您可以解析元标记,任何负责任的程序员都应将其包含在
元素中。
您还可以选择拒绝任何标头或元标记中没有字符集的 html。
You can parse a meta tag which any responsible programmer should have included in the
<head>
element.You can also choose to reject any html which does not have the charset in the header or in a meta tag.