.NET中如何跨PC正确序列化XML中的德语变音字符?
德语字符XML序列化乱码问题解决
我尝试将包含德语ä字符的文本序列化为XML文件,在一台PC上运行正常,但在其他PC上,ä被显示为д或д,还有的显示为方块。已尝试多种方法,代码如下:
string text = "säure"; XmlSerializerNamespaces xmlnsEmpty = new XmlSerializerNamespaces(); xmlnsEmpty.Add("", ""); // This line solves the issue with saving XML file with German letters on some PCs XmlSerializer xmlSerializer = new XmlSerializer(typeof(string)); var utfWithoutBom = new UTF8Encoding(false); var settings = new XmlWriterSettings { Encoding = Encoding.UTF8, // Use UTF-8 to support German letters Indent = true, OmitXmlDeclaration = true, }; using var stream = new FileStream("output.xml", FileMode.Create); //using var sw = new StreamWriter(stream,Encoding.GetEncoding("ISO-8859-1")); using var writer = XmlWriter.Create(stream, settings); System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de-DE"); xmlSerializer.Serialize(writer, text, xmlnsEmpty);
问题根源
- 缺失XML编码声明:设置
OmitXmlDeclaration = true后,生成的XML文件没有编码声明节点<?xml version="1.0" encoding="utf-8"?>,不同PC的读取工具会默认使用系统本地编码(如Windows-1251、GBK等)解析文件,而非指定的UTF-8,直接引发乱码。 - 未启用定义的无BOM UTF-8:代码中声明了
utfWithoutBom变量,但未将其赋值给XmlWriterSettings.Encoding,实际使用的是带BOM的默认Encoding.UTF8,部分工具对BOM的处理差异也会导致显示异常。 - CurrentCulture设置无效:
CurrentThread.CurrentCulture = de-DE对XML序列化的字符编码无影响,编码规则由XmlWriterSettings.Encoding决定。
修正后的代码
最可靠的方案是保留XML编码声明,让读取端明确识别文件编码:
string text = "säure"; XmlSerializerNamespaces xmlnsEmpty = new XmlSerializerNamespaces(); xmlnsEmpty.Add("", ""); XmlSerializer xmlSerializer = new XmlSerializer(typeof(string)); // 选择无BOM的UTF-8,如需带BOM可直接替换为Encoding.UTF8 var utfWithoutBom = new UTF8Encoding(false); var settings = new XmlWriterSettings { Encoding = utfWithoutBom, Indent = true, OmitXmlDeclaration = false, // 保留XML编码声明 }; using var stream = new FileStream("output.xml", FileMode.Create); using var writer = XmlWriter.Create(stream, settings); xmlSerializer.Serialize(writer, text, xmlnsEmpty);
额外注意事项
- 若必须省略XML声明,读取文件时需强制指定UTF-8编码(如程序中用
Encoding.UTF8读取,记事本打开时手动选择UTF-8),但这种方式依赖读取端配置,可靠性较低。 - 检查读取工具的编码设置:比如用记事本打开文件时,通过「文件」-「另存为」查看当前编码,若不是UTF-8则手动选择后重新打开。
内容的提问来源于stack exchange,提问作者Aram Gevorgyan
相关产品推荐
相关产品推荐

