2012-01-02 86 views
1

我有以下XML:转换KOI8-R XML节点转换为Unicode在C#

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

我知道这段文字是用编码KOI8-R产生的(这个文本显示在我的文本编辑器中,只有当我选择这种编码当我打开XML文件为文本),我想将此节点的值转换为可在C#中使用的字符串。我可以读取此节点的InnerText值,但这不是我所期望的。有人能告诉我用这种编码将字符串转换成Unicode的正确方法吗?

更新

继乔恩斯基特建议,解决方案应该是这样的:

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

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

回答

2

如何你有XML?它应该有一个XML声明,说明它正在使用哪种编码;否则就简单地用XML来说是不正确的。你不应该在之后编码,因为你已经解析了XML。因此可能是这样的:

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

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

+0

该文件是由外部工具生成的(xpdf - 我认为),这是我得到的唯一的东西。现在,我不太熟悉linq和外部声明......我应该使用哪些名称空间来指定OpenText方法的编码?我尝试了System.Linq和System.Xml.Linq,但它们都没有工作... – dcg 2012-01-02 10:41:50

+1

@dcg:如果你不想使用'XDocument',那么'XmlDocument.Load'也会带一个'TextReader' 。但是,如果xpdf基本上创建了一个无效的XML文件或一个文本错误的文件,那么它非常糟糕。您确定这不是在流水线早期出现问题吗?确切地找出问题出在哪里是值得的,否则你很可能会丢失数据。 – 2012-01-02 10:44:23

+0

不幸的是,我无法去改变那件事。这是非常旧的代码由其他人写的,它迄今为止工作得很好。对我来说,看看innerText值会更容易/更快。那么,它就是这样的!谢谢! – dcg 2012-01-02 10:55:04