带有重音符号的 XML 字符编码问题
Posted
技术标签:
【中文标题】带有重音符号的 XML 字符编码问题【英文标题】:XML charactor encoding issues with accents 【发布时间】:2011-09-26 17:07:57 【问题描述】:我现在在处理项目时遇到过几次问题,我想知道是否有一个优雅的解决方案。
问题 我正在通过 XML 从 twitter 中提取推文并将它们上传到我的数据库,但是当我将它们输出到屏幕时,我得到了这些字符:
“搬到杜塞尔多夫。â��” 要么 坦比安
如果我有俄语字符,那么我会得到很多丑陋的盒子。
我想要的是在一种编码下显示正确的本地口音。我认为使用 UTF-8 是可能的。
我正在使用什么
php、mysql读入 XML 文件后,我将执行以下操作来清理数据:
$data = trim($data);
$data = htmlentities($data);
$data = mysql_real_escape_string($data);
我的数据库排序规则是:utf8_general_ci
网页字符集为:charset=UTF-8
我认为这可能与 HTML 实体有关,但我真的很欣赏一个在项目中全面运作的解决方案。
提前致谢。
【问题讨论】:
【参考方案1】:您需要将连接的编码更改为 UTF-8(通常为 iso-8859-1)。见这里:How can I store the '€' symbol in MySQL using PHP?
如果编码正确,则无需调用htmlentities()
。我会完全删除它。在 HTML 上下文中输出数据时,您只需要小心使用htmlspecialchars()
。
【讨论】:
【参考方案2】:替换这一行:
$data = htmlentities($data);
有了这个:
$data = htmlentities($data, null, "UTF-8");
这样,htmlentities() 将单独保留有效的 UTF-8 字符。如需更多信息,请参阅the documentation for htmlentities()。
【讨论】:
【参考方案3】:确保您使用iconv_set_encoding 将您的php 内部编码设置为UTF8,并且您使用EdoDodo 所说的编码信息调用htmlentities
。还要确保您是使用 UTF8 编码的数据库存储,尽管您说情况已经如此。
【讨论】:
【参考方案4】:您不能将htmlentities()
的默认状态用于 XML 数据,因为此函数生成 HTML 实体,而不是 XML 实体。
不同之处在于 HTML DTD 定义了一组实体代码,Web 浏览器被编程来解释这些代码。但是大多数 XML DTD 没有定义它们(如果 XML 甚至有一个 DTD)。
默认情况下可用于 XML 的唯一实体代码是 >
、<
和 &
。所有其他实体都需要使用它们的数字实体来呈现。
PHP 没有xmlentities()
函数,但是如果您阅读the manual page for htmlentities()
,您会在cmets 中看到很多人都遇到过同样的问题并发布了他们的解决方案。快速浏览后,我建议查看名为 philsXMLClean()
的那个。
希望对您有所帮助。
【讨论】:
以上是关于带有重音符号的 XML 字符编码问题的主要内容,如果未能解决你的问题,请参考以下文章