XML编码的问题

时间:2011-11-15 20:32:45

标签: c# character-encoding

我试图将此作为一般性问题,但意识到我不够了解,所以这就是我遇到的问题。

以下是控制台应用程序的代码段:

public void Run()
{
    Run(Console.Out);
}

public void Run(TextWriter writer)
{
    DataTable customers = _quickBooksAdapter.GetTableData("Customer");
    customers.WriteXml(writer);
}

然后我从控制台运行它并使用“>”将它放在一个文件中。

c:\> QuickBooksETL extract US > qb_us.xml

如果我尝试按正常情况加载结果:

var x = XDocument.Load("qb_us.xml");

我收到错误:

Invalid character in the given encoding. Line 8, position 26.

所以我试图确定.NET“认为”使用的是什么:

string path = @"\\ad1\accounting$\Xml\qb_us.xml"; 
StreamReader sr = new StreamReader(path);
sr.CurrentEncoding.Dump();

结果:

System.Text.UTF8Encoding 
BodyName utf-8
EncodingName Unicode (UTF-8)
HeaderName utf-8
WebName utf-8
WindowsCodePage 1200
IsBrowserDisplay True
IsBrowserSave True
IsMailNewsDisplay True
IsMailNewsSave True
IsSingleByte False
EncoderFallback 5EncoderReplacementFallback  
System.Text.EncoderReplacementFallback 
DefaultString �
MaxCharCount 1
DecoderFallback 5DecoderReplacementFallback  
System.Text.DecoderReplacementFallback 
DefaultString �
MaxCharCount 1
IsReadOnly True
CodePage 65001

最后,我猜测如果我只是明确地说它是ASCII,那就可以了:

string path = @"\\ad1\accounting$\Xml\qb_us.xml"; 
StreamReader sr = new StreamReader(path, Encoding.ASCII);
var x = XDocument.Load(sr);

任何关于我哪里出错的想法都将不胜感激。我承认我从来没有对角色编码进行过“深入研究”,但我愿意努力做到这一点。

2 个答案:

答案 0 :(得分:2)

简单的答案是以使控制台参与其中。直接从您的代码写入文件:

public void Run(string filename)
{
    DataTable customers = _quickBooksAdapter.GetTableData("Customer");
    customers.WriteXml(filename);
}

或自己创建TextWriterStream并将其传递给,例如

public void Run(Stream output)
{
    DataTable customers = _quickBooksAdapter.GetTableData("Customer");
    customers.WriteXml(output);
}

请注意,通过将其读取为ASCII,您基本上可以获取原始数据中任何非ASCII字符的问号。 IIRC,当遇到无法处理的二进制数据时,这是编码的默认行为。

使用Stream它应该默认以UTF-8写出,并且XML声明和文件中的数据应该匹配。

答案 1 :(得分:1)

根据我的经验,如果您的数据包含非法字符(例如,字符12),则除非您使用带有XmlTextReader的{​​{1}}读取XML,否则XML不会往返。我一直在使用Normalization = false,而不是XmlSerializer.Deserialize()。不过,您可以尝试使用XDocument.Load()传递Load(XmlReader)来调用XmlTextReader重载。

我会将自己的声音添加到Jon的,建议您写入自己的信息流,而不是Normalization = false