带有重音符的XML字符编码问题

时间:2011-07-01 11:47:12

标签: php mysql xml character-encoding html-entities

我在处理项目时已经遇到过几次这个问题,我想知道是否有一个优雅的解决方案。

问题 我正在通过推特上的XML提取推文并将其上传到我的数据库,但是当我将它们输出到屏幕时,我会得到这些字符:

  

“搬到了杜塞尔多夫。”   要么   tambiéÑ

如果我有俄文字符,那么我会得到很多丑陋的盒子。

我想要的是在一种编码下显示正确的原生重音。我认为使用UTF-8是可能的。

我正在使用

  • PHP,MYSQL

在读取XML文件后,我正在执行以下操作来清理数据:

    $data = trim($data);
    $data = htmlentities($data);
    $data = mysql_real_escape_string($data);

我的数据库整理是:utf8_general_ci

网页字符集为:charset = UTF-8

我认为它可能与HTML实体有关,但我非常感谢能够在项目中全面运作的解决方案。

提前致谢。

4 个答案:

答案 0 :(得分:6)

替换此行:

$data = htmlentities($data);

有了这个:

$data = htmlentities($data, null, "UTF-8");

这样,htmlentities()将仅保留有效的UTF-8字符。有关详细信息,请参阅the documentation for htmlentities()

答案 1 :(得分:2)

您需要将连接的编码更改为UTF-8(通常是iso-8859-1)。见这里:How can I store the '€' symbol in MySQL using PHP?

如果您正确编码,则无需调用htmlentities()。我会完全删除它。当在HTML上下文中输出数据时,您必须小心使用htmlspecialchars()

答案 2 :(得分:0)

确保使用iconv_set_encoding设置php内部编码或UTF8,并使用EdoDodo所说的编码信息调用htmlentities。还要确保你是使用UTF8编码的数据库存储,尽管你已经说过了。

答案 3 :(得分:0)

您不能在其数据的默认状态中使用htmlentities(),因为此函数会生成HTML实体,而不是XML实体。

不同之处在于HTML DTD定义了一组实体代码,网络浏览器被编程为解释。但是大多数XML DTD都没有定义它们(如果XML甚至有DTD)。

默认情况下,XML可用的唯一权利代码是><&。所有其他实体都需要使用其数字实体进行呈现。

PHP没有xmlentities()功能,但是如果您阅读the manual page for htmlentities(),您会在评论中看到很多人遇到过同样的问题并发布了他们的解决方案。在快速浏览之后,我建议查看名为philsXMLClean()的那个。

希望有所帮助。