无法理解这些xml编码的困境

时间:2009-10-21 15:17:15

标签: .net xml character-encoding

以下大量代码(为简洁而剪切)会生成一个xml doc,并将其吐出到文件中。如果我在Visual Studio中打开文件,它似乎是中文字符。如果我在记事本中打开它,它看起来像预期的那样。如果我Console.WriteLine看起来是正确的。

我知道它与编码有关,但我虽然连续编码了所有的编码。有什么遗漏?

StringBuilder stringBuilder = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.Unicode;
settings.Indent = true; 
settings.IndentChars = "\t";
using (XmlWriter textWriter = XmlWriter.Create(new StringWriter(stringBuilder), settings))
{
    textWriter.WriteStartElement("Submission");
    textWriter.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
    textWriter.WriteEndElement();
}

using (StreamWriter sw = new StreamWriter(new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None)))
            {
                sw.Write(stringBuilder.ToString());
            }

2 个答案:

答案 0 :(得分:2)

问题是您使用UTF-8将其写入磁盘,但它声明为UTF-16,因为这是{{1}默认情况下使用 - 并且因为您明确地将其设置为使用StringWriter

解决此问题的最简单方法是使用StringWriter将其自身声明为UTF-8:

Encoding.Unicode

...然后删除public class Utf8StringWriter : StringWriter { public override Encoding { get { return Encoding.UTF8; } } } 行。这样你就可以使用UTF-8。 (实际上,当您使用settings.Encoding = Encoding.Unicode创建Encoding时,XmlWriterSettings的{​​{1}}属性会被忽略。)

如果你真的想要 UTF-16,那么当你创建XmlWriter时,也要指定TextWriter

答案 1 :(得分:0)

我不确定Encoding.Unicode是什么,但我猜它是UTF-16,每个字符写入两个字节到文件中。对于普通的ASCII文本,其中一个字节始终为0.

请尝试使用UTF-8。除非您使用特殊字符(代码点> = 128),否则在任何编辑器中看起来都应该相同。