【发布时间】:2020-05-31 13:51:35
【问题描述】:
在学习 C# XmlWriter 课程时,我遇到了一些奇怪的行为。输出到文件时,它按预期使用 UTF-8,但输出到控制台时,它使用我的系统代码页 (862) 而不是 UTF-8。我知道控制台不支持 UTF-8,所以我想知道如果流是控制台,XmlWriter 是否默认为系统代码页?
重现行为的代码:
using System;
using System.Xml;
namespace xmlwriterTest
{
class Program
{
static void Main(string[] args)
{
var settings = new XmlWriterSettings
{
Indent = true
};
using (XmlWriter writer = XmlWriter.Create(Console.Out, settings))
{
writer.WriteStartDocument();
writer.WriteStartElement("users");
writer.WriteStartElement("user");
writer.WriteAttributeString("age", "42");
writer.WriteString("John Doe");
writer.WriteEndElement();
writer.WriteStartElement("user");
writer.WriteAttributeString("age", "39");
writer.WriteString("Jane Doe");
writer.WriteEndDocument();
writer.Close();
Console.WriteLine("\n\n");
}
}
}
}
预期输出:
<?xml version="1.0" encoding="utf-8"?>
实际输出:
<?xml version="1.0" encoding="Codepage - 862"?>
编辑 我的问题不是如何在控制台中实现预期的输出。这就是为什么首先会发生这种情况
【问题讨论】:
-
如何通过将
Encoding属性覆盖到UTF8来创建一个使用StringBuilder的自定义StringWriter,并在控制台中输出这个代表xml 的字符串生成器。 -
使用 MemoryStream 作为 Stream 输出:它不会妨碍您。如果您使用 StringWriter,编码将始终为 UTF-16,无论您指定为
XmlWriterSettings.Encoding属性值(如果您想确保输出中没有 BOM,则应为Encoding = Encoding.UTF8或new UTF8Encoding(false))。