DOMDocument对我的字符串做了什么?

时间:2011-02-21 05:49:40

标签: php unicode domdocument

$dom = new DOMDocument('1.0', 'UTF-8');

$str = '<p>Hello®</p>';

var_dump(mb_detect_encoding($str)); 

$dom->loadHTML($str);

var_dump($dom->saveHTML()); 

View

输出

string(5) "UTF-8"

string(158) "<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>Hello&Acirc;&reg;</p></body></html>
"

为什么我的Unicode ®会转换为&Acirc;&reg;,如何阻止它?

我今天疯了吗?

3 个答案:

答案 0 :(得分:5)

您可以添加xml编码标记(稍后将其删除)。这适用于我没有库存Centos 5.x(ubuntu,cpanel的php):

<?php
$dom = new DOMDocument('1.0', 'UTF-8');
$str = '<p>Hello®</p>';
var_dump(mb_detect_encoding($str)); 
$dom->loadHTML('<?xml encoding="utf-8">'.$str);
var_dump($dom->saveHTML()); 

这就是你得到的:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<?xml encoding="utf-8"><html><body><p>Hello&reg;</p></body></html>

除了你得到这个的日子:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<?xml encoding="utf-8"><html><body><p>Hello&Acirc;&reg;</p></body></html>

答案 1 :(得分:2)

我在将UTF-8传递给loadHTML之前将其解码为UTF-8。

$dom->loadHTML( utf_decode( $html ) );

saveHTML()似乎将像德语变音符号这样的特殊字符解码为HTML实体。 (虽然我设置$dom->substituteEntities=false; ... o.O)

这很奇怪,正如文档所述:

  

DOM扩展使用UTF-8编码。

(http://www.php.net/manual/de/class.domdocument.php,搜索utf8)

哦,亲爱的,用PHP编码会一次又一次地出现问题......永远不会结束故事。

答案 2 :(得分:1)

您的文本编辑器在UTF-8中显示"®",但文件中的字节在Latin-1(或类似编码)中表示"®",这是PHP用来读取它的内容。使用字符实体引用将消除这种歧义。

>>> print u'®'.encode('utf-8').decode('latin-1')
®