PHP多字节字符串和使用DOMDOCUMENT的问题

时间:2016-07-08 19:09:51

标签: php html dom multibyte

使用PHP 5.6.11 - 我有一个utf-8编码的HTML块。多字节字符串在文本中进行编码。

以下是一个字符串示例:

"You haven’t added"

在utf-8控制台(linux)上使用hexdump(参见e2 80 99?)查看:

00000000  59 6f 75 20 68 61 76 65  6e e2 80 99 74 20 61 64  |You haven...t ad|

这里是html实体:

"You haven’t added"

这一切都还可以。然而,当我将它加载到domdoc时,它再次出现损坏(显示为html实体)。

"You haven’t added"

以下是生成此代码段的代码。

$text="<html><body>You haven’t added anything.<br></body></html>";
echo  mb_detect_encoding($text)."\n";
$text2= substr($text,strpos($text,"You haven"),20); 
echo $text2."\n";
echo htmlentities($text2); 

$doc = new DOMDocument('1.0',  'utf-8');
$doc->loadHTML($text);
$text2 = $doc->saveHTML();
$text2= substr($text2,strpos($text2,"You haven"),35); 
echo "\n".htmlentities($text2)."\n";

这个输出是:

UTF-8
You haven’t added 
You haven&rsquo;t added 
You haven&amp;acirc;&amp;#128;&amp;#153;t added

我尝试了各种各样的想法,但我似乎无法让domdoc破坏HTML或多字节。有什么建议吗?

修改:如果我插入元标记,它会按预期更有效。

$text='<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/></head><body>You haven’t added anything.<br></body></html>';

输出:

UTF-8
You haven’t added 
You haven&rsquo;t added 
You haven&rsquo;t added anything.&lt;br&gt;&lt;/

编辑2:

使用charset = utf-8插入元标记可以正常工作:

$doc->loadHTML(mb_convert_encoding($text, 'HTML-ENTITIES', 'UTF-8'));

修复编码。我仍然无法弄清楚domdocument在编码方面做了什么,我已经尝试过至少3次这行,但它没有工作。可能需要一点时间远离键盘,因为它现在似乎正在工作。如果在更大的数据集上测试它时出现问题,我会更新此信息。

0 个答案:

没有答案