背景
最近在做博客的SEO,在 Google Search Console
提交 Sitemap
的时候提示格式不正确,但是Bing WebMaster Tool
又能接受,对比了下Google提供的格式发现我的 Sitemap
的xml文件头中编码部分是 encoding=utf-16
但是标准 Sitemap
是utf-8
的,微软估计做了兼容所以没有报错
原因
本博的 Sitemap
是使用 StringBuilder
和 XmlWriter
构建的,
var sb =new StringBuilder();
var writerSettings = new XmlWriterSettings { Indent = true,Encoding = Encoding.UTF8};
using (XmlWriter writer = XmlWriter.Create(sb, writerSettings))
{
...
}
但是使用 StringBuilder
创建XmlWriter
时会忽略XmlWriterSettings
中的编码格式,而使用Stringbuilder
的UTF-16
编码(C# 中的字符串在内存中始终以 UTF-16
编码存储),导致输出的xml文件头encoding="utf-16"
解决方案
可以使用MemoryStream
配合StreamWriter
创建XmlWriter
来解决
using var mem =new MemoryStream();
using var sw = new StreamWriter(mem, Encoding.UTF8);
var writerSettings = new XmlWriterSettings { Indent = true,Encoding = Encoding.UTF8};
using (XmlWriter writer = XmlWriter.Create(sw, writerSettings))
{
writer.WriteStartDocument();
writer.WriteStartElement("Root");
writer.WriteElementString("Child", "Hello, World!");
writer.WriteEndElement();
writer.WriteEndDocument();
}
Console.WriteLine(Encoding.UTF8.GetString(mem.ToArray()));
此时xml文件头中encoding="utf-8"
Comments