繁体   English   中英

PHP DOMDocument nodeValue转储文字UTF-8字符而不是编码

[英]PHP DOMDocument nodeValue dumps literal UTF-8 characters instead of encoded

我遇到了类似这个问题的问题

来自DomDocument的nodeValue在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特定问题的任何信息。

UPDATE

以前进的名义,我已经从HTML5lib和DOMDocument切换到Simple HTML DOM ,并导出干净的转义html,然后我可以将其解析回正确的UTF-8实体。

另外,我没试过的一个功能是

utf8_decode

这对于遇到此问题的其他人来说可能是一个解决方案。 它解决了我在AJAX / PHP中遇到的相关问题,解决方案发现于2009年的博客文章: 克服AJaX UTF-8编码限制(在PHP中)

刚刚在nodeValue上使用utf8_decode,它确实有点工作,有特殊字符无法正确显示的问题。

但是,某些字符仍然存在问题,例如简单引用'和其他一些字符(例如)

所以使用$ element-> nodeValue将不起作用,但utf8_decode($ element-> nodeValue)将 - PARTLY。

函数utf8_decodeutf8_encode命名不是很好。 它们分别从utf-8转换为iso-8859-1 ,从iso-8859-1utf-8

使用utf-8作为参数调用时, mb_convert_encoding通常类似于使用函数utf8_encode 通常情况下 ,除非你改变了内部代码页,你可能 - 希望 - 没有)。

PHP的大多数函数都希望字符串是iso-8859-1编码的。 但是,libxml(这是php的xml解析库的底层库)需要字符串为utf-8 因此,如果您不谨慎,可以轻松地使用损坏的编码。

至于你的测试,第一行可能具有欺骗性。 由于脚本中有文字é ,因此测试会根据您保存文件的编码而改变。请检查文本编辑器。

希望澄清一下。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM