含汉字的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
相关产品推荐
相关产品推荐

