【发布时间】:2011-03-03 20:28:02
【问题描述】:
我遇到了类似于this question的问题:
nodeValue from DomDocument returning weird characters in PHP
我发现的根本原因可以用 mb_convert_encoding() 来模仿
在我的单元测试中,这终于发现了问题:
$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
我是否看到编码稳定性失败。
我的猜测是 domdocument 导出到 nodeValue 的 htmlentities 捕获使用了编码转换器,但忽略了内联编码值。
鉴于我的问题与 HTML5 有关,我认为这与实现的新颖性直接相关,但它似乎是一个更广泛的问题。除了开头提到的问题之外,我无法通过搜索找到有关 DOMDocument 特定问题的任何信息。
更新
以前进的名义,我已从 HTML5lib 和 DOMDocument 切换到 Simple HTML DOM,它导出干净的转义 html,然后我可以将其解析回正确的 UTF-8 实体。
另外,我没有尝试过的一个功能是
utf8_decode
因此,对于遇到此问题的其他人来说,这可能是一个解决方案。它解决了我在使用 AJAX/PHP 时遇到的一个相关问题,在 2009 年的这篇博文中找到了解决方案:Overcoming AJaX UTF-8 Encoding Limitation (in PHP)
【问题讨论】:
-
欢迎来到 SO!一些额外的问题。你所说的“原始价值”是什么意思,你能举一些例子吗?包含
é的脚本文件是什么编码?你能显示正确的值和失败的值吗?您在页面上使用什么输出编码? -
“原始值”是指最终呈现的值是此函数调用的结果
html_entity_decode('&Atilde;&copy;',ENT_QUOTES,'UTF-8')所以,基本上在源 html 中有一个包含字符 é 的单词的 span,当我使用$span->nodeValue提取该跨度的内容时,其中$span是DOMDocumentgetElementsByTagName()的结果。我正在尝试在任何地方使用 UTF-8,meta 设置为 UTF-8,根据这个 html:<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> -
因此,html 页面显示
é并且nodeValue的结果是&Atilde;&copy;的渲染等效值,据我所知,这相当于 @987654337 时发生的情况@ 在没有默认编码 UTF-8 的系统上运行
标签: php encoding utf-8 character-encoding domdocument