PHP DOMDocument loadHTML不能正确编码UTF-8 [英] PHP DOMDocument loadHTML not encoding UTF-8 correctly
问题描述
我试图使用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屋!