【问题标题】:PHP encoding with DOMDocument使用 DOMDocument 进行 PHP 编码
【发布时间】:2010-01-26 19:48:16
【问题描述】:
<tag>
Алекс М
</tag>

当我尝试使用 DOMDocument 函数获取以下代码的内容时,它返回如下内容:

ÐÐ»ÐµÐºÑ Ðœ

我尝试使用 mb_convert_encoding、iconv 和 utf8_encode 将 DOMDocument 编码设置为不同的值(UTF-8、ISO-8859-1),但没有成功。

我怎样才能得到“Алекс М”而不是“ÐÐ»ÐµÐºÑ Ðœ”?

编辑:输入来自加载了 curl 的页面。当我将页面内容输出到浏览器时,字符显示正确(所以我怀疑输入是问题)。

【问题讨论】:

  • 你能把你用来创建文档的代码和重要的内容贴进去吗?

标签: php dom character-encoding


【解决方案1】:

试试:

$string = file_get_contents('your-xml-file.xml');
$string = mb_convert_encoding($string, 'utf-8', mb_detect_encoding($string));
// if you have not escaped entities use
$string = mb_convert_encoding($string, 'html-entities', 'utf-8'); 
$doc = new DOMDocument();
$doc->loadXML($string);

【讨论】:

  • 我用一个简单的£符号遇到了这个问题,这个答案似乎已经解决了。需要注意的是,如果你在字符串上使用html-entities,那么你将无法进行loadXML,因为XML会报错未知实体;您必须使用 loadHTML。但是,我怀疑有一个函数可以将它们转换为像 « 这样的实体。管他呢。麻烦的是,这并不是一个好的答案,因为它使文本无法阅读,但是 PHP 在编码问题上有点臭名昭著。
  • 我想指出,当您获得生成的 HTML 时,您可以在末尾添加这一行:$html = mb_convert_encoding($html, 'utf-8', 'html-entities'); 它将一些 html 实体转换回其原始值。
  • 仅供参考 - 我试过这个(希望它是修复!:))我确定它是......但是,我的客户没有安装 mb_string 模块(DOH !)所以我发现了这个stackoverflow.com/questions/7220737/… 对我有用(utf8-encode/decode 响应)。
【解决方案2】:

我在使用 XPath 解析 DomDocument 之后遇到了类似的问题,并且在阅读了这篇文章之后

https://bugs.php.net/bug.php?id=32547

我是这样解决的

// Workaround because PHP 5.2.x has encoding problems, when we 
// update to PHP 5.3 this line is not necesserry any more
$content = '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />' . $content;

// Creating new DOM document and loading HTML content
$dom_document = new DOMDocument('1.0', 'UTF-8');
$dom_document->substituteEntities = TRUE;
$dom_document->loadHTML($content);

【讨论】:

  • 感谢您发布此信息。我正在维护一个运行 PHP 5.2.6 的旧服务器,并且一直遇到这个问题。这解决了它。
【解决方案3】:

为您的标签添加 xml 标头 - 试试这个:

$a = new DOMDocument ();
$a->loadXml ('<?xml version="1.0" encoding="UTF-8"?><tag>Алекс М</tag>');
print htmlspecialchars ($a->saveXml ());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 2019-07-08
    相关资源
    最近更新 更多