将 XDocumnet 从 win-1251 编码为 utf-8

Encode XDocumnet form win-1251 to utf-8

我尝试将 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>

我想我现在明白了。无论出于何种原因,您 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);