带有 php 和重音字符以及 ENT_XML1 的 XML 的 UTF-8 编码

Posted

技术标签:

【中文标题】带有 php 和重音字符以及 ENT_XML1 的 XML 的 UTF-8 编码【英文标题】:UTF-8 encoding for XML with php and accent characters along with ENT_XML1 【发布时间】:2018-06-22 12:37:58 【问题描述】:

一个持续了一年多的问题,虽然我已经纠正了但已经演变成一个怪物。

我使用 php 系统上生成的 XML 在站点之间移动大量数据。主要是文本,我遇到了一些破坏传输的基本 XML 项,因此我使用了所有 XML 值的这段代码。

$value=str_replace("'","'",$value);
print '<'.$key.'>';
print htmlspecialchars($value, ENT_XML1 | ENT_QUOTES, 'UTF-8');
print '</'.$key.'>'; 

$key 是字段,这对所有数据都非常有效,除了包含重音的任何数据,例如 piñata。带有 ñ 字符的值显示为完全为空。

我还没有找到一个函数来清理用 PHP 格式化 XML 的文本。我目前将数据库中的数据转储为这种格式,然后在接收端加载到 SIMpleXML 以加载回数据库。

通过清理所有数据或可能的 json 编码而不是 XML 的解决方案可能会很棒。

谢谢-克里斯

【问题讨论】:

如果它的服务器到服务器,为什么不base64url编码键/值,我个人会使用RPC来做这种事情。 Base64 编码/解码显示奇怪的结果 $value = 'ñ';打印$值; $value = base64_encode($value);打印 base64_decode($value);前 2 行自己打印正确的 ñ ,在编码解码后我得到 2 个字符 сс base64url 编码上面的注意事项,如果你使用像 这样的键不起作用,base64url 编码会阻止非安全字符。 3v4l.org/LehjA,在我的测试中,虽然我无法将 ñ 变成 cc,所以我不确定那里发生了什么。 我相信我的 base64 问题与我的第一个问题的根本原因相同。输入的编码不是UTF-8。我没有尝试编码然后更改为 base64。 【参考方案1】:

对于我的例子,即使我所有的表都设置为 UTF-8,在构造我的 XML 时,我必须将值设置为 UTF-8

$value=str_replace("'","&#039;",$value);
print '<'.$key.'>';
$value = utf8_encode($value);
print htmlspecialchars($value, ENT_XML1 | ENT_QUOTES, 'UTF-8');
print '</'.$key.'>'; 

不确定在从表格读取和放置之间何时更改编码,但这产生了我需要的结果。我不认为带有特殊字符的 BASE64 是可行的。

【讨论】:

【参考方案2】:

如果您使用 XML Api(DOM、XMLReader),它将处理值/文本内容的编码问题。但是标签名称是一个不同的问题。您必须创建规范化的标签名称或使用固定的标签名称。然后将原始字段名称存储为属性值。

例如带有固定标签名称field:

<records>
  <record>
    <field name="some field">some content</field>
  </record>
</records>

这是更简洁的变体,因为这里没有动态标记名称,您可以创建 Schema/DTD 并验证 XML。

或字段名称的规范化版本:

<records>
  <record>
    <some-field>some content</some-field>
  </record>
</records>

这通常用作将数据结构序列化为 XML 的通用方式。它只是格式良好的 XML,您不能定义 Schema/XSD,因为标签名称取决于数据。

【讨论】:

以上是关于带有 php 和重音字符以及 ENT_XML1 的 XML 的 UTF-8 编码的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有无效字符(重音)的 Pandas 数据框与数组匹配? [复制]

ASP.NET Core 3.1 - IIS 服务器上带有重音字符问题的字符串后面的代码

在带有重音字母的语言中转义 HTML

文件名中带有重音字符的 PHP ZipArchive

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

带重音符号的 QProcess 输入字符串