我遇到类似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 catch使用了编码转换器,但忽略了内联编码值。
鉴于我的问题是HTML5,我认为它与实现的新颖性直接相关,但它似乎是一个更广泛的问题。除了开头提到的问题之外,我无法通过搜索找到有关DOMDocument特定问题的任何信息。
更新
以前进的名义,我已经从HTML5lib和DOMDocument切换到Simple HTML DOM,并导出干净转义的html,然后我可以将其解析回正确的UTF-8实体。
另外,我没试过的一个功能是
utf8_decode
因此,对于遇到此问题的其他人来说,这可能是一个解决方案。它解决了我在AJAX / PHP中遇到的一个相关问题,该解决方案发现于2009年的博客文章中:Overcoming AJaX UTF-8 Encoding Limitation (in PHP)
答案 0 :(得分:2)
刚刚在nodeValue上使用了utf8_decode,它确实有点工作,有特殊字符无法正确显示的问题。
然而,一些角色仍然存在问题,例如简单引用'和其他一些(例如) -
因此使用$ element-> nodeValue将无效,但utf8_decode($ element-> nodeValue)将 - PARTLY。
答案 1 :(得分:1)
函数utf8_decode
和utf8_encode
的命名不是很好。它们分别从utf-8
转换为iso-8859-1
,从iso-8859-1
转换为utf-8
。
mb_convert_encoding
作为参数调用时, utf-8
通常与使用函数utf8_encode
类似。 (通常除非你改变了内部代码页,你可能 - 希望 - 没有。)
大多数PHP的函数都希望字符串被iso-8859-1
编码。但是,libxml(这是php的xml解析库的底层库)期望字符串为utf-8
。因此,如果你不谨慎,你很容易就会遇到错误的编码。
至于你的测试,第一行可能具有欺骗性。由于您的脚本中有文字é
,因此测试会根据您保存文件的编码而更改。请检查文本编辑器。
希望澄清一点。