用编辑器改过 sitemap 之后保存成了 gb2312 编码,XML 声明还写着 utf-8,GSC 提示无法读取,百度则收录了一批乱码标题。

一开始怀疑是「生成脚本没有指定输出编码,跟随了服务器 locale」,查了一圈,方向不对。

真正麻烦的地方在于,几个原因的现象几乎一样。编辑器按本地默认编码保存,覆盖了原来的 UTF-8。也可能是XML 声明与实际字节编码不一致,解析在第一个中文处失败。

还有一种情况,CDN 按文本类型返回时补了错误的 charset。

动手时先确认文件的真实编码

file -i sitemap.xml && head -c 60 sitemap.xml

转成 UTF-8 并保留声明

iconv -f gb2312 -t utf-8 sitemap.xml > sitemap_utf8.xml && mv sitemap_utf8.xml sitemap.xml

然后在生成脚本里固定输出编码

xml = xml.encode('utf-8'); open('sitemap.xml', 'wb').write(xml)

末了确认响应头里的 charset

curl -sI https://www.example.com/sitemap.xml | grep -i content-type

别只看报错消失,验证要多做一步。转码并固定输出后,GSC 重新读取成功,乱码标题在下次抓取时被替换成正常文本。

提醒一点。XML 声明只是自述,解析器仍然按字节判断,声明和实际编码不一致时错误往往出在第一个中文上。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189