PHP DOMDocument loadHTML不能正确编码UTF-8 [英] PHP DOMDocument loadHTML not encoding UTF-8 correctly

查看:175
本文介绍了PHP DOMDocument loadHTML不能正确编码UTF-8的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图使用DOMDocument解析一些HTML,但是当我这样做,我突然失去了我的编码(至少这是我看起来如此)。

  $ profile =< div>< p>各种日语字符< / p>< / div>; 
$ dom = new DOMDocument();
$ dom-> loadHTML($ profile);

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

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

这段代码的结果是我得到了一组不是日本。但是,如果我这样做:

  echo $ profile; 

它正确显示。我试过saveHTML和saveXML,并且都不能正确显示。我使用PHP 5.3。



我看到了:

 ã ¤ãªãã¤ã·ã·ã«ã'ã«ã|ãã¢ã¤ã«ã©ã³ãç³»ã®åºåå¼ãã5çªçããããããçã¾ãããå½¼ãã«ãã|ääºåã俳åªã«ãªã£ ããç¶èªªã¯æ¨æã®ã»ã¼ãããªã¯ã§ãæ¯èªªã¯éμ便å±ã®å®¢å®¤äããã£ããé«æ¡æ代ãã㣣 ãã£ãããããããããããããããÂãããããããããããããããããããããããããããããã‰ã > 

应显示哪些内容:

 非常有限公司家庭に,9人兄弟の5番目として生まれる。父亲は木材のセールスマンで,母亲は邮便局の客室系だった。高校时代はキャディのアバタにでししみ,教育资金を受けながらカティックションの高校へ进学

编辑:到五行,以便您自己测试。

  $ profile =< div lang = ja>< p&州シカゴにて,アイルランド系の家庭に,< / p>< / div>; 
$ dom = new DOMDocument();
$ dom-> loadHTML($ profile);
echo $ dom-> saveHTML();
echo $ profile;

这是返回的html:

 < div lang =ja>< p>ã,¤ãƒªãƒŽã,¤å·žã,·ã,«ã,'ã«ã|ã€ã, ¢ã,¤ãƒ«ãƒ©ãƒ³ãƒ‰ç³»ã®å®¶åºã«ã€< / p>< / div> 
< div lang =ja>< p>

gt;< / p><


解决方案

DOMDocument :: loadHTML 会将你的字符串视为在ISO-8859-1,除非你另有说明。这导致UTF-8字符串被不正确地解释。 SmartDOMDocument 中有一个解决方法,可帮助您:

  $ profile ='< div>< p>イリノイ州シカゴにて,アイルランド系の家庭に,9< / p>< / div ;'; 
$ dom = new DOMDocument()
$ dom-> loadHTML(mb_convert_encoding($ profile,'HTML-ENTITIES','UTF-8'));
echo $ dom-> saveHTML($ dom-> getElementsByTagName('div') - > item(0));另一种方法是使用XML编码声明预先附加HTML,以将字符串视为UTF-8,然后将该字符串转换为UTF-8。只要该文档不包含一个:

  $ dom-> loadHTML('<??xml encoding = utf-8?>'。$ profile); 


I'm trying to parse some HTML using DOMDocument, but when I do, I suddenly lose my encoding (at least that is how it appears to me).

$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);
}

The result of this code is that I get a bunch of characters that are not Japanese. However, if I do:

echo $profile;

it displays correctly. I've tried saveHTML and saveXML, and neither display correctly. I am using PHP 5.3.

What I see:

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

What should be shown:

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

EDIT: I've simplified the code down to five lines so you can test it yourself.

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

Here is the html that is returned:

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

解决方案

DOMDocument::loadHTML will treat your string as being in ISO-8859-1 unless you tell it otherwise. This results in UTF-8 strings being interpreted incorrectly. There's a workaround in SmartDOMDocument which should help you:

$profile = '<div><p>イリノイ州シカゴにて、アイルランド系の家庭に、9</p></div>';
$dom = new DOMDocument();
$dom->loadHTML(mb_convert_encoding($profile, 'HTML-ENTITIES', 'UTF-8'));
echo $dom->saveHTML($dom->getElementsByTagName('div')->item(0));

An alternative is to prepend the HTML with an XML encoding declaration to treat the string as UTF-8, provided that the document doesn't already contain one:

$dom->loadHTML('<?xml encoding="utf-8" ?>' . $profile);

这篇关于PHP DOMDocument loadHTML不能正确编码UTF-8的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆