【问题标题】:If my XML document instruction specifies encoding of UTF-8 do I still need to escape characters?如果我的 XML 文档指令指定了 UTF-8 编码,我还需要转义字符吗?
【发布时间】:2012-12-26 12:15:15
【问题描述】:

我知道在所有情况下我都需要逃避这些:

quot  "
amp   &
apos  '
lt    <
gt    >

但是有口音的国际字符,或者俄罗斯字符来命名一对呢?当我的编码指令设置为 UTF-8 时,是否需要转义这种类型的字符?

如果我将编码指令设置为 ASCII 会怎样?我还需要转义所有这些字符吗?

这是我尝试使用 Nokogiri(lib2xml) 重现的 XML 示例(来自遗留系统):

<?xml version="1.0" encoding="UTF-8"?>
  <DESCRIPTION lang="rus">
    <SHORT_DESCRIPTION>&#1052;&#1054;&#1044;&#1059;&#1051;&#1068;- ELECTRONIC  OUTPUT 120 V DC 5 mA</SHORT_DESCRIPTION>
    <LONG_DESCRIPTION>&#1052;&#1054;&#1044;&#1059;&#1051;&#1068;- &#1058;&#1048;&#1055; ELECTRONIC  OUTPUT &#1042;&#1061;&#1054;&#1044; 120 V DC &#1042;&#1067;&#1061;&#1054;&#1044; 5 mA &#1048;&#1057;&#1058;&#1054;&#1063;&#1053;&#1048;&#1050; &#1055;&#1048;&#1058;&#1040;&#1053;&#1048;&#1071; 120 V DC &#1044;&#1054;&#1055;&#1054;&#1051;&#1053;&#1048;&#1058;&#1045;&#1051;&#1068;&#1053;&#1040;&#1071; &#1044;&#1045;&#1058;&#1040;&#1051;&#1068; 1 ANALOG SM322-8S TOR</LONG_DESCRIPTION>
 </DESCRIPTION>

您可以看到示例中的指令说 UTF-8,但它们已经转义了很多字符,Nokogiri 只有在我指定 ASCII 编码指令时才会转义的字符。这让我很困惑。

编辑 2:如果我不向 Nokogiri 传递编码指令,则生成的 XML 会将所有俄语字符保留在其原生西里尔字母中,但这与我需要复制的 XML 不一致。

【问题讨论】:

  • 不,你没有。但请确保您实际上将文件编码为 UTF-8... 仅具有属性 encoding="UTF-8" 并不能做到这一点。
  • Esailija 提出了一个很好的观点。这里有两件事 - 声明的编码,它告诉解析器文档编码,以及用于将字符数据写入编码八位字节的编码。它们必须匹配,否则解析器使用错误的解析器并在读取数据时破坏数据。
  • 我在我需要复制的 xml 文件中添加了一个示例,它在说明中说明了编码 UTF-8,但转义了不应转义的字符,因为它们是有效的 UTF-8。
  • 更新后的样本仍然可能是合法的 UTF-8,但这可能是一个 hack,因为在某些时候开发其中一个系统(生产者、消费者或中间层)的人没有'无法真正理解 UTF-8,或者必须使用自认为可以但没有使用的技术。
  • 听起来我有两个选择,告诉 xml builder UTF-8 并相信它会转义所有非 UTF-8 字符并强制不符合要求的消费系统更改,或者破解我的输出匹配旧版本,转义所有非 ascii 字符。如果我选择前者,我可能会有一场战斗。

标签: ruby xml encoding xml-parsing nokogiri


【解决方案1】:

您只需要在以下任一情况下使用字符引用来表示字符:

  • 它在当前上下文中具有特殊含义(因此您列出的五个字符有时只需要编码)
  • 文件编码的字符编码中不存在

ASCII 中没有很多字符,因此如果您将 XML 编码为 ASCII,您将不得不对很多字符使用字符引用。

不要将您的 XML 编码为 ASCII。 XML 的默认编码是 UTF-8,得到很好的支持。

【讨论】:

  • 我编辑了问题以添加更多细节。我是否应该假设如果 libxml2 在我指定 UTF-8 编码指令时没有转义字符,那么它是有效的并且应该在所有 xml 解析器中都有效?
  • 是的。 (-------------------------------- StackOverflow 不喜欢简短的答案,所以我把它写得很长)
猜你喜欢
  • 2019-02-20
  • 1970-01-01
  • 2014-06-22
  • 2011-05-12
  • 2010-11-08
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
相关资源
最近更新 更多