带有 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 编码上面的注意事项,如果你使用像ñ
变成 cc
,所以我不确定那里发生了什么。对于我的例子,即使我所有的表都设置为 UTF-8,在构造我的 XML 时,我必须将值设置为 UTF-8
$value=str_replace("'","'",$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 数据框与数组匹配? [复制]