【问题标题】:UTF-8 encoding for XML with php and accent characters along with ENT_XML1带有 php 和重音字符以及 ENT_XML1 的 XML 的 UTF-8 编码
【发布时间】: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。

标签: php xml utf-8 accent-sensitive


【解决方案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,因为标签名称取决于数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-21
      • 2014-01-09
      • 2017-10-18
      • 2011-05-09
      • 2011-10-03
      • 2011-09-26
      • 2020-01-18
      • 2013-12-28
      相关资源
      最近更新 更多