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

Posted

技术标签:

【中文标题】带有重音符号的 XML 字符编码问题【英文标题】:XML charactor encoding issues with accents 【发布时间】:2011-09-26 17:07:57 【问题描述】:

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

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

“搬到杜塞尔多夫。â��” 要么 坦比安

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

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

我正在使用什么

phpmysql

读入 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 字符编码问题的主要内容,如果未能解决你的问题,请参考以下文章

下载不同编码的在线文本

似乎无法解码的 json 编码字符串

带有重音字符的 Java 属性文件

Freemarker 编码 - 用问号代替重音字符

带有重音/拉丁字符的 JSON 请求

MySQL 表中带有重音符号的字符串在 R (RODBC) 中返回为 NA