以下大量代码(为简洁而剪切)会生成一个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());
}
答案 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),否则在任何编辑器中看起来都应该相同。