首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP DOMDocument loadHTML未正确编码UTF-8

PHP DOMDocument loadHTML未正确编码UTF-8
EN

Stack Overflow用户
提问于 2011-11-22 04:37:53
回答 11查看 121.6K关注 0票数 223

我试图使用DOMDocument解析一些超文本标记语言,但是当我这样做时,我突然丢失了我的编码(至少在我看来是这样的)。

代码语言:javascript
复制
$profile = "<div><p>various japanese characters</p></div>";
$dom = new DOMDocument();
$dom->loadHTML($profile); 

$divs = $dom->getElementsByTagName('div');

foreach ($divs as $div) {
    echo $dom->saveHTML($div);
}

此代码的结果是我得到了一堆不是日语的字符。但是,如果我这样做了:

代码语言:javascript
复制
echo $profile;

它可以正确显示。我尝试过saveHTML和saveXML,但都不能正确显示。我使用的是PHP 5.3。

我看到的是:

代码语言:javascript
复制
ã¤ãªãã¤å·ã·ã«ã´ã«ã¦ãã¢ã¤ã«ã©ã³ãç³»ã®å®¶åº­ã«ã9人åå¼ã®5çªç®ã¨ãã¦çã¾ãããå½¼ãå«ãã¦4人ã俳åªã«ãªã£ããç¶è¦ªã¯æ¨æã®ã»ã¼ã«ã¹ãã³ã§ãæ¯è¦ªã¯éµä¾¿å±ã®å®¢å®¤ä¿ã ã£ããé«æ ¡æ代ã¯ã­ã£ãã£ã®ã¢ã«ãã¤ãã«å¤ãã¿ãæè²è³éãåããªããã«ããªãã¯ç³»ã®é«æ ¡ã¸é²å­¦ã

应显示的内容:

代码语言:javascript
复制
イリノイ州シカゴにて、アイルランド系の家庭に、9人兄弟の5番目として生まれる。彼を含めて4人が俳優になった。父親は木材のセールスマンで、母親は郵便局の客室係だった。高校時代はキャディのアルバイトに勤しみ、教育資金を受けながらカトリック系の高校へ進学

编辑:我已经将代码简化为5行,这样你就可以自己测试它了。

代码语言:javascript
复制
$profile = "<div lang=ja><p>イリノイ州シカゴにて、アイルランド系の家庭に、</p></div>";
$dom = new DOMDocument();
$dom->loadHTML($profile);
echo $dom->saveHTML();
echo $profile;

下面是返回的html:

代码语言:javascript
复制
<div lang="ja"><p>イリノイ州シカゴã«ã¦ã€ã‚¢ã‚¤ãƒ«ãƒ©ãƒ³ãƒ‰ç³»ã®å®¶åº­ã«ã€</p></div>
<div lang="ja"><p>イリノイ州シカゴにて、アイルランド系の家庭に、</p></div>
EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2011-11-22 05:18:49

除非您另行说明,否则DOMDocument::loadHTML会将您的字符串视为ISO-8859-1格式。这会导致UTF-8字符串被错误解释。

如果您的字符串不包含XML编码声明,您可以在前面加上一个,以使该字符串被视为UTF-8:

代码语言:javascript
复制
$profile = '<p>イリノイ州シカゴにて、アイルランド系の家庭に、9</p>';
$dom = new DOMDocument();
$dom->loadHTML('<?xml encoding="utf-8" ?>' . $profile);
echo $dom->saveHTML();

如果您不知道字符串是否已经包含这样的声明,SmartDOMDocument中有一个变通方法可以帮助您:

代码语言:javascript
复制
$profile = '<p>イリノイ州シカゴにて、アイルランド系の家庭に、9</p>';
$dom = new DOMDocument();
$dom->loadHTML(mb_convert_encoding($profile, 'HTML-ENTITIES', 'UTF-8'));
echo $dom->saveHTML();

这不是一个很好的解决办法,但由于不是所有字符都可以用ISO-8859-1表示(就像这些片假名一样),所以它是最安全的替代方法。

票数 605
EN

Stack Overflow用户

发布于 2011-11-22 04:59:07

确保将真正的源文件保存为UTF-8 (您甚至可能希望使用UTF-8来尝试不推荐的BOM字符)。

另外,对于HTML,请确保您已经使用meta标记声明了正确的编码:

代码语言:javascript
复制
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

如果是CMS (因为你已经用Joomla标记了你的问题),你可能需要为编码配置适当的设置。

票数 19
EN

Stack Overflow用户

发布于 2017-11-20 23:57:11

我花了一段时间才弄明白,但这是我的答案。

在使用DomDocument之前,我会使用file_get_contents来检索urls,然后使用字符串函数处理它们。也许不是最好的方法,但很快。在确信Dom同样快速之后,我首先尝试了以下方法:

代码语言:javascript
复制
$dom = new DomDocument('1.0', 'UTF-8');
if ($dom->loadHTMLFile($url) == false) { // read the url
    // error message
}
else {
    // process
}

这在保留UTF-8编码方面失败了,尽管这里和其他地方提供了适当的meta标签、php设置和所有其他补救措施。以下是有效的方法:

代码语言:javascript
复制
$dom = new DomDocument('1.0', 'UTF-8');
$str = file_get_contents($url);
if ($dom->loadHTML(mb_convert_encoding($str, 'HTML-ENTITIES', 'UTF-8')) == false) {
}

等等。现在,世界上的一切都是正确的。希望这能有所帮助。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8218230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档