无法理解这些 xml 编码问题
-
05-07-2019 - |
题
下面的代码块(为了简洁而进行了剪裁)生成一个 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),否则在任何编辑器中看起来都应该相同。
不隶属于 StackOverflow