【问题标题】:wrong encoding - xml numeric replacement is misinterpreted错误的编码 - xml 数字替换被误解
【发布时间】:2017-10-18 09:27:37
【问题描述】:

我有代表从邮件客户端导出的电子邮件的 xml 文件。不幸的是,当我尝试读取这些文件时,未显示特殊字符,因为显示的是原始字符。

我试图让这个在我用 .Net 编写的客户端中正确读取。

示例:我得到以下数字替换:

á  

这被解释为:

á

虽然原始/预期值为:

ú

或许更好的例子:

Tað eftir er av árinum ber tó til at logga á

这被解释为:

Tað eftir er av árinum ber tó til at logga á

原始/预期值为:

Tað eftir er av árinum ber tó til at logga á

我可以观察到问题似乎是,.Net 将 ð 解释为两个单独的字符,而实际上代表一个字符。

我相信我应该能够使用这个网站将解释值转换为预期值(虽然不是我得到的确切字符):http://www.i18nqa.com/debug/utf8-debug.html

但我无法在 .Net 中正确显示它。

x.Load(
  New StreamReader(
    File.Open("content.xml", FileMode.Open),
    Encoding.GetEncoding(1252), True
  )
)

这并没有什么不同。如果我尝试 Encoding.Unicode 则它无法读取文件(错误:根级别的数据无效)

【问题讨论】:

  • 为什么您希望将两个数字替换解析为单个字符?数字替换用于 character 实体,而不是 bytes。 TL;DR:我认为您的 XML 不正确,而不是 .NET 的处理方式。
  • 也许我可以手动取两个十进制值 195 和 161 并转换为十六进制,这将变成 c3 和 ba,这是字符 ú 的 UTF-8 十六进制值。但是这个转换功能难道不是以某种方式内置在 .net 中的吗?
  • 我认为你错过了我的意思。 .NET 中的 XML 处理正是它应该做的。如果要在 XML 中表示 U+00FA,则应表示为úú。实体中的数字是一个代码点,如下所示:w3.org/TR/xml/#sec-references - 它不是意味着“作为字符编码表示的一部分的字节”。
  • @JonSkeet 我不确定 - 只是 xml 文档中的每个非英语字符都由 2 个数字表示形式表示。 195 161 = ú、195 176 = ð 等。XML 可能不正确,但这是我必须使用的...
  • @Andras - 请为您自己着想:与其尝试修复客户端发送给您的不良 XML,不如尝试说服您的客户向您发送良好的 XML。你得到的东西是完全错误的。

标签: .net xml encoding


【解决方案1】:

在另一个帖子中找到我的答案:https://stackoverflow.com/a/5130065/1113421

首先以 UTF-8 格式加载文档,然后在我需要的 XML 节点上进行即时转换:

VB 代码

Dim x As New XmlDocument

x.Load(New StreamReader(File.Open("content.xml", FileMode.Open), Encoding.UTF8, True))

Dim nl As XmlNodeList = x.SelectNodes("product/HEADER/object")

  For Each nd As XmlNode In nl
    Dim result As String = Encoding.UTF8.GetString(Encoding.GetEncoding("ISO-8859-1").GetBytes(nd.InnerText))
    Me.txtTemporaryTextbox.Text += result & vbCrLf
  Next

这让我对 nd.InnerText 中的外来字符有了正确的解释。

感谢@JonSkeet 的详细说明和链接,为我指明了正确的方向,以便进一步挖掘。

【讨论】:

  • 从字节流(如文件)加载 XML 时,无需指定字符编码。只需让 XML 引擎找出编码。加载文件时,不要使用字符阅读器,使用字节流。
猜你喜欢
  • 2015-09-18
  • 2012-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
相关资源
最近更新 更多