PHP 将重音字符导出到 XML 失败



我正在使用将重音字符从mySQL数据库导出到XML,但是我得到了非常不稳定的结果。

对于基础知识 - mySQL 表设置为拉丁语 1 编码。 不理想。 但是,所有输入都通过 HTML 实体运行,这似乎工作得很好;我可以整天读回数据,并且在屏幕上看起来是正确的。

下面是一个示例项目。

在屏幕上,它看起来像这样:

me hace reír

请注意重音"i"字符(带尖音符(。

在数据库中,它存储如下:

me hace reír

带有急性的"i"被正确替换为HTML实体,从而可以在屏幕上正确显示。 如果我将其包装在文本区域中,它仍然可以正确读取 - 没有急性 HTML 实体,只是他更正了重音"i"字符。

我的 XML 文件上面有一个正确的 UTF-8 标头:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?

但是当我从数据库中读取数据并将其导出到 XML 时......

$xml.="<dedicatedBecause>".($dedicatedbecause)."</dedicatedBecause>"."n";

由于"$dedicatedbecause"保存了来自数据库的完全未处理的数据,我在XML文件中得到以下内容:

me hace reí-r

换句话说,不同的重音字符加上破折号。 在其他情况下,我会得到其他无意义的字符(版权符号、各种其他重音等(。

我有一个巨大的功能将数据按摩到 UTF-8,但这似乎并不重要。 如果我关闭它,我会得到相同的结果。

什么给? 我在这里错过了什么?

感谢您的帮助!

&iacute;是一个命名的(X(HTML实体。它们在基本的、格式良好的 XML 中是未知的/有效的。将其转换为 UTF-8 是正确的方法。但它看起来在某些时候您将带有解码实体的 UTF-8 字符串视为拉丁语-1。Ã是典型的症状。

下面是一个引发该行为的演示:

$data = 'me hace re&iacute;r';
$decoded = html_entity_decode($data, ENT_COMPAT, "UTF-8");
$treatedAsLatin1 = utf8_encode($decoded);
var_dump(
$decoded, $treatedAsLatin1
);

输出:

string(13) "me hace reír"
string(15) "me hace reír"

utf8_encode()是一个旧的 PHP 函数,用于将拉丁语 1 字符串转换为 UTF-8。但是,这也可能发生在浏览器中(取决于您的HTTP标头(。

最新更新