我试图使用DOMDocument解析一些HTML,但是当我这样做时,我突然丢失了我的编码(至少在我看来是这样)。
$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);
}
这段代码的结果是我得到了一堆不是日语的字符。然而,如果我这样做:
echo $profile;
显示正确。我尝试了saveHTML和saveXML,两者都不能正确显示。我使用的是PHP 5.3。
我所看到的:
ã¤ãªãã¤å·ã·ã«ã´ã«ã¦ãã¢ã¤ã«ã©ã³ãç³»ã®å®¶åºã«ã9人åå¼ã®5çªç®ã¨ãã¦çã¾ãããå½¼ãå«ãã¦4人ã俳åªã«ãªã£ããç¶è¦ªã¯æ¨æã®ã»ã¼ã«ã¹ãã³ã§ãæ¯è¦ªã¯éµä¾¿å±ã®å®¢å®¤ä¿ã ã£ãã髿 ¡æä»£ã¯ãã£ãã£ã®ã¢ã«ãã¤ãã«å¤ãã¿ãæè²è³éãåããªããã«ããªãã¯ç³»ã®é«æ ¡ã¸é²å¦ã
应该展示什么:
イリノイ州シカゴにて、アイルランド系の家庭に、9人兄弟の5番目として生まれる。彼を含めて4人が俳優になった。父親は木材のセールスマンで、母親は郵便局の客室係だった。高校時代はキャディのアルバイトに勤しみ、教育資金を受けながらカトリック系の高校へ進学
编辑:我将代码简化为五行,以便您可以自己测试。
$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>イリノイ州シカゴにて、アイルランド系の家庭に、</p></div>
我花了一段时间才想明白,下面是我的答案。
在使用DomDocument之前,我将使用file_get_contents检索url,然后使用字符串函数处理它们。也许不是最好的方法,但是很快。在确信Dom的速度也一样快之后,我首先尝试了以下方法:
$dom = new DomDocument('1.0', 'UTF-8');
if ($dom->loadHTMLFile($url) == false) { // read the url
// error message
}
else {
// process
}
尽管有适当的元标记、PHP设置以及这里和其他地方提供的所有其他补救措施,但在保留UTF-8编码方面却失败了。以下是有效的方法:
$dom = new DomDocument('1.0', 'UTF-8');
$str = file_get_contents($url);
if ($dom->loadHTML(mb_convert_encoding($str, 'HTML-ENTITIES', 'UTF-8')) == false) {
}
等。现在世界一切都好了。
DOMDocument::loadHTML将把您的字符串视为ISO-8859-1 (HTTP/1.1默认字符集),除非您另有说明。这将导致UTF-8字符串被错误地解释。
如果你的字符串不包含XML编码声明,你可以在前面加上一个,使字符串被视为UTF-8:
$profile = '<p>イリノイ州シカゴにて、アイルランド系の家庭に、9</p>';
$dom = new DOMDocument();
$dom->loadHTML('<?xml encoding="utf-8" ?>' . $profile);
echo $dom->saveHTML();
如果你不知道字符串是否已经包含这样的声明,在SmartDOMDocument中有一个解决方案,它应该会帮助你:
$profile = '<p>イリノイ州シカゴにて、アイルランド系の家庭に、9</p>';
$dom = new DOMDocument();
$dom->loadHTML(mb_convert_encoding($profile, 'HTML-ENTITIES', 'UTF-8'));
echo $dom->saveHTML();
这不是一个很好的解决办法,但由于不是所有字符都可以在ISO-8859-1中表示(比如这些武士刀),这是最安全的替代方案。
我花了一段时间才想明白,下面是我的答案。
在使用DomDocument之前,我将使用file_get_contents检索url,然后使用字符串函数处理它们。也许不是最好的方法,但是很快。在确信Dom的速度也一样快之后,我首先尝试了以下方法:
$dom = new DomDocument('1.0', 'UTF-8');
if ($dom->loadHTMLFile($url) == false) { // read the url
// error message
}
else {
// process
}
尽管有适当的元标记、PHP设置以及这里和其他地方提供的所有其他补救措施,但在保留UTF-8编码方面却失败了。以下是有效的方法:
$dom = new DomDocument('1.0', 'UTF-8');
$str = file_get_contents($url);
if ($dom->loadHTML(mb_convert_encoding($str, 'HTML-ENTITIES', 'UTF-8')) == false) {
}
等。现在世界一切都好了。