You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含汉字的XmlDocument用XmlTextWriter转ISO-8859-1编码乱码求助

解决ISO-8859-1编码下XML汉字变成"??"的问题

这个坑我之前踩过!核心原因特别直白:ISO-8859-1(也就是Latin-1)编码的字符集里根本没有汉字,当你强行用它来编码汉字时,.NET框架会把所有无法映射的字符直接替换成"?",这就是你看到乱码的根源。

那怎么在必须用ISO-8859-1输出XML的前提下保留汉字呢?答案是利用XML的字符实体引用机制——XmlWriter会自动把无法用指定编码表示的字符转换成&#xXXXX;格式的实体,这样即使是ISO-8859-1编码也能正确存储,后续解析XML时又能还原成汉字。

下面是修改后的正确代码:

MemoryStream mStream = new MemoryStream();
Encoding enc = Encoding.GetEncoding("ISO-8859-1");

// 用XmlWriterSettings来配置更规范,替代过时的XmlTextWriter
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = enc;
settings.Indent = true; // 可选,让XML格式更美观

using (XmlWriter writer = XmlWriter.Create(mStream, settings))
{
    doc.WriteTo(writer);
}

// 重置流位置,读取内容
mStream.Position = 0;
string formattedXML;
using (StreamReader sReader = new StreamReader(mStream, enc))
{
    formattedXML = sReader.ReadToEnd();
}

关键改动说明:

  • 替换了过时的XmlTextWriter,改用XmlWriter.Create配合XmlWriterSettings,这是.NET推荐的写法,配置更灵活。
  • XmlWriter会自动处理字符转换:当遇到ISO-8859-1无法表示的汉字时,会把它转换成类似我(对应“我”)的实体引用,这些实体都是ASCII字符,能被ISO-8859-1正确编码,不会变成"??"。
  • 后续解析这个XML时,任何标准的XML解析器都会自动把这些实体还原成对应的汉字,完全不影响使用。

额外提示:

如果你的场景不是必须用ISO-8859-1,我强烈建议直接用UTF-8编码——它支持所有Unicode字符(包括汉字),不需要转实体,代码更简单,只需要把enc改成Encoding.UTF8即可,这样XML里的汉字会直接以UTF-8字节存储,可读性更好。

内容的提问来源于stack exchange,提问作者J Jackson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:03:03