下面的代码块(为了简洁而进行了剪裁)生成一个 xml 文档,并将其输出到一个文件中。如果我在 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());
            }
有帮助吗?

解决方案

问题是你要把它写到 磁盘 使用UTF-8,但它会 宣称 是 UTF-16 因为这就是 StringWriter 默认情况下使用 - 并且因为您明确将其设置为使用 Encoding.Unicode 以及。

解决此问题的最简单方法是使用将自己标榜为 UTF-8 的 StringWriter:

public class Utf8StringWriter : StringWriter
{
    public override Encoding
    {
         get { return Encoding.UTF8; }
    }
}

...然后删除 settings.Encoding = Encoding.Unicode 线。这样您就可以在整个过程中使用 UTF-8。(事实上​​, Encoding 的财产 XmlWriterSettings 创建时会被忽略 XmlWriter 与一个 TextWriter 反正。)

如果你真的 UTF-16,那么当您创建 StreamWriter, , 指定 Encoding.Unicode 那里也有。

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top