【问题标题】:convert KOI8-R xml node into unicode in c#在c#中将KOI8-R xml节点转换为unicode
【发布时间】:2012-01-31 17:53:18
【问题描述】:

我有以下 xml:

<root>
   <text><![CDATA[ОПЕЛХМЮБЮ ОПЕГ БЗПРЪЫ ЯЕ АЮПЮАЮМ, Б ЙНИРН ЯЕ]]></text>
</root>

我知道此文本是使用编码 KOI8-R 生成的(仅当我将 xml 文件作为文本打开时选择此编码时,此文本才会显示在我的文本编辑器中)并且我想将此节点的值转换为在 c# 中可用的字符串。我可以读取该节点的 InnerText 值,但这不是我所期望的。有人可以告诉我将用这种编码编写的字符串转换为 Unicode 字符串的正确方法吗?

更新

按照 Jon Skeet 的建议,解决方案如下所示:

Encoding encoding = Encoding.GetEncoding("KOI8-R");
XmlDocument doc2 = new XmlDocument();

using (TextReader tr = new StreamReader(outputPath, encoding))
{
    doc2.Load(tr);
}

【问题讨论】:

    标签: c# unicode character-encoding


    【解决方案1】:

    如何你有那个 XML?它应该有一个 XML 声明,说明它正在使用哪种编码;否则它在 XML 术语中是不正确的。 解析 XML 之后,您不必担心编码问题。所以可能是这样的:

    Encoding encoding = Encoding.GetEncoding("KOI8-R");
    XDocument doc;
    using (var reader = File.OpenText("file.xml", encoding))
    {
        doc = XDocument.Load(reader);
    }
    

    ...但正如我所说,文件本身应该声明编码。

    【讨论】:

    • 该文件是由外部工具(xpdf - 我认为)生成的,这是我唯一得到的。现在,我对 linq 和那些外部声明不太熟悉……我应该使用哪些命名空间来指定 OpenText 方法的编码?我尝试使用 System.Linq 和 System.Xml.Linq 但它们都不起作用......
    • @dcg:如果你不想使用XDocument,那么XmlDocument.Load 也会使用TextReader。但是,如果 xpdf 基本上是在创建一个无效的 XML 文件或一个包含错误文本的文件,那就太糟糕了。你确定这不是管道早期出错的东西吗?有必要找出问题的确切位置,否则您很容易丢失数据。
    • 不幸的是,我没有办法去改变那个东西。这是由其他人编写的相当古老的代码,到目前为止它运行良好。对我来说,看看 innerText 值会更容易/更快。嗯,它是这样工作的!谢谢!
    • @dcg:请注意,如果文档的其余部分没有使用相同的方式编码,您很可能只是将问题存储起来以备后用。如果这是您要长期使用的东西,我会认真考虑花时间修复旧代码。
    猜你喜欢
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 2011-08-28
    相关资源
    最近更新 更多