使用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’t added
You haven&acirc;&#128;&#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’t added
You haven’t added anything.<br></
编辑2:
使用charset = utf-8插入元标记可以正常工作:
$doc->loadHTML(mb_convert_encoding($text, 'HTML-ENTITIES', 'UTF-8'));
修复编码。我仍然无法弄清楚domdocument在编码方面做了什么,我已经尝试过至少3次这行,但它没有工作。可能需要一点时间远离键盘,因为它现在似乎正在工作。如果在更大的数据集上测试它时出现问题,我会更新此信息。