【问题标题】:Encode XDocumnet form win-1251 to utf-8将 XDocument 从 win1251 编码为 utf-8
【发布时间】:2015-10-02 19:29:55
【问题描述】:

我尝试将 XDocument 从 win-1 转换为 utf-8。但在原始观点中,俄罗斯角色的观点很差。

var encoding = new UTF8Encoding(false,false);

        XmlTextWriter xmlTextWriter = new XmlTextWriter("F:\\File", Encoding.GetEncoding("windows-1251"));
        document.Save(xmlTextWriter);
        xmlTextWriter.Close();
        xmlTextWriter = null;

        string text = File.ReadAllText("F:\\File", Encoding.Default);
        XDocument documentcode = XDocument.Parse(text);
        xmlTextWriter = new XmlTextWriter(_Stream, encoding);
        documentcode.Save(xmlTextWriter);
        xmlTextWriter.Flush();

        _Stream.Position = 0;
        Headers.ContentType = new MediaTypeHeaderValue("application/xml");

这是 SOAPUI 中的原始视图

<?xml version="1.0" encoding="utf-8"?><StatObservationList><StatObservation><ObjectID>0b575ec1-7dea-41c4-a1f0-287190715ed2</ObjectID><Name>Тестовое статнаблюдение</Name><Code>GPPCode42</Code></StatObservation><StatObservation><ObjectID>3a871ea1-06ee-4991-a263-d643b424bdd4</ObjectID><Name>МиСП</Name><Code /></StatObservation></StatObservationList>

【问题讨论】:

  • 您正在使用 Encoding.Default 打开文件。你确定它和你保存的一样吗?尝试使用 Encoding.GetEncoding("windows-1251") 打开它,因为它是保存时使用的编码
  • 转换是什么意思?目前尚不清楚您要做什么。 XDocument(或内存中的任何字符串)在您对其进行编码之前没有编码 - 即直到您将其写入流。顺便说一句,你不应该使用XmlTextWriter,你应该使用XmlWriter.Create创建一个作家。
  • 我使用 XmlTextWrite 删除 BOM。
  • 目前还不清楚您要做什么。听起来您只需要document.Save(_Stream) - 有什么问题?
  • 我使用了 document.Save(_Stream),在原始视图中得到了相同的结果。我在论坛上看到了这段代码string text = File.ReadAllText("F:\\File", Encoding.GetEncoding(1251)); document.Declaration = new XDeclaration("1.0", "utf-8", "yes"); XDocument documentcode = XDocument.Parse(text);but 它不起作用/

标签: c# xml utf-8 linq-to-xml encode


【解决方案1】:

我想我现在明白了。无论出于何种原因,您的XDocument 中的文本已使用 Windows-1251 错误地解码。

理想情况下,您需要返回源代码并确保正确解码(使用 UTF8)。转换它可能不是一个完全无损的过程,因为 UTF8 中的代码点在 Windows-1251 中没有表示形式(例如,快速浏览code page 显示0x98 没有任何内容) .

然而,要在事后进行转换,最简单的方法就是取回文本,获取解码时使用的编码字节,然后使用正确的编码解码:

var windows1251 = Encoding.GetEncoding("windows-1251");
var utf8 = Encoding.UTF8;

var originalBytes = windows1251.GetBytes(document.ToString());
var correctXmlString = utf8.GetString(originalBytes);
var correctDocument = XDocument.Parse(correctXmlString);

【讨论】:

  • win1251中的俄语字符有完整的utf8表示,我查了一下。
  • 这可能是真的,但反之则不然 - 这就是您可能遇到的问题。您拥有的文本最初使用 UTF8 编码,但使用 Windows-1251 解码错误。
猜你喜欢
  • 2012-04-24
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 2012-06-30
相关资源
最近更新 更多