我遇到了类似于这个问题的问题:
在PHP中,从DomDocument返回的nodeValue返回奇怪的字符
我发现根本原因可以通过mb_convert_encoding()来模拟。
在我的单元测试中,最终捕捉到了这个问题。
UTF-8 数据的原始值似乎正在传输,而 PHP 运行的系统的基本代码页很可能不是 UTF-8。
一直到解析(使用将数据转储到 DOMDocument 的 HTML5lib 实现),字符串保持清洁、友好的 UTF-8。只有在使用时提取数据时才会出现问题。
我看到编码稳定性出现了失败。
我的猜测是,htmlentities在domdocument导出到nodeValue时使用了编码转换器,但忽略了内联编码值。
考虑到我的问题与HTML5有关,我认为它与实现的新颖性直接相关,但似乎是一个更广泛的问题。我没有找到任何关于这个问题特定于DOMDocument的信息,除了上面提到的问题。
更新:
为了向前迈进,我已经从HTML5lib和DOMDocument切换到Simple HTML DOM,它可以导出干净的转义HTML,然后我可以将其解析回正确的UTF-8实体。
另外,我没有尝试的一个函数是:
这可能是其他遇到此问题的人的解决方案。它解决了我在AJAX/PHP方面遇到的一个相关问题,该解决方案可以在2009年的博客文章中找到:克服AJaX UTF-8编码限制(在PHP中)。
在我的单元测试中,最终捕捉到了这个问题。
$test = mb_convert_encoding('é', "UTF-8");
$this->assertTrue(mb_check_encoding($test,'UTF-8'),'data is UTF-8');
$this->assertTrue($this->rw->checkEncoding($test,'UTF-8'),'data is UTF-8');
$this->assertIdentical($test,html_entity_decode('é',ENT_QUOTES,'UTF-8'),'values match');
UTF-8 数据的原始值似乎正在传输,而 PHP 运行的系统的基本代码页很可能不是 UTF-8。
一直到解析(使用将数据转储到 DOMDocument 的 HTML5lib 实现),字符串保持清洁、友好的 UTF-8。只有在使用时提取数据时才会出现问题。
$span->nodeValue
我看到编码稳定性出现了失败。
我的猜测是,htmlentities在domdocument导出到nodeValue时使用了编码转换器,但忽略了内联编码值。
考虑到我的问题与HTML5有关,我认为它与实现的新颖性直接相关,但似乎是一个更广泛的问题。我没有找到任何关于这个问题特定于DOMDocument的信息,除了上面提到的问题。
更新:
为了向前迈进,我已经从HTML5lib和DOMDocument切换到Simple HTML DOM,它可以导出干净的转义HTML,然后我可以将其解析回正确的UTF-8实体。
另外,我没有尝试的一个函数是:
utf8_decode
这可能是其他遇到此问题的人的解决方案。它解决了我在AJAX/PHP方面遇到的一个相关问题,该解决方案可以在2009年的博客文章中找到:克服AJaX UTF-8编码限制(在PHP中)。
é
的脚本文件使用的编码是什么?能展示正确和失败的值吗?您在页面上使用的输出编码是什么? - Pekkahtml_entity_decode('é',ENT_QUOTES,'UTF-8')
所以,本质上,在源HTML中有一个包含字符é的单词的span标签。当我使用$span->nodeValue
提取该span标签的内容时,其中$span
是DOMDocumentgetElementsByTagName()
的结果。 我正在尝试在所有地方都使用UTF-8,在这个HTML中,元数据设置为UTF-8,如下所示: `<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />` - Dave Espionageé
,而nodeValue
的结果是渲染等效于Ã&copy;
的结果,根据我所读的内容,这相当于在没有默认编码为UTF-8的系统上运行mb_check_encoding('é', 'UTF-8')
时发生的情况。 - Dave Espionage