XML Unicode反序列化

XML Unicode deserialization

我有一个 XML 文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <student name="Adnand"/>
     <student name="özil"/>
     <student name="ärnold"/>
</students>

如您所见,我有一个 UTF-8 encoding,但我使用了一些非 UTF-8 字符 (ö, ä).

我使用下面的代码反序列化这个 XML:

public void readXML(string path)
{
    XmlSerializer deserializer = new XmlSerializer(typeof(Students));
    TextReader reader = new StreamReader(path);       
    object obj = deserializer.Deserialize(reader);
    Students myStudents = (Students)obj;
}

反序列化过程没问题,但是特殊字符显示为�符号。我尝试更改编码类型,但没有任何改变。有人可以帮我看看我有什么选择吗?

回答 您应该指定 Encoding.Default 如

public void readXML(string path)
{
    XmlSerializer deserializer = new XmlSerializer(typeof(Students));
    TextReader reader = new StreamReader(path, Encoding.Default);       
    object obj = deserializer.Deserialize(reader);
    Students myStudents = (Students)obj;
}

可以使用StreamReader指定编码

var Students xmlObject = null;
using (var streamReader = new StreamReader(inXML, Encoding.UTF8, true)) {
    var xmlSerializer = new XmlSerializer(typeof(Students));
    xmlObject = (Students)xmlSerializer.Deserialize(streamReader);
}

你也试过使用编码"ISO-8859-1",我主要用它来处理外来字符

这对我有用:

class Program
{
    static void Main(string[] args)
    {
        List<Student> students = new List<Student>();
        XDocument xDocument = XDocument.Load("icsemmelle.xml");
        List<XElement> xStudents = xDocument.Descendants("student").ToList();
        foreach(XElement xStudent in xStudents)
        {
            students.Add(new Student { Name = xStudent.Attribute("name").Value });
        }
    }
}

class Student
{
    public string Name { get; set; }
}

您的文件似乎没有编码为 UTF-8,而是编码为 Window 的默认 ANSI 编码。

将 StreamReader 定义为

TextReader reader = new StreamReader(path, Encoding.Default)

应该可以解决问题。


请注意,这更像是一种解决方法,使用 Encoding.Default 实际上是一个非常 糟糕的 想法,因为它会在使用另一种文化时崩溃。 This article 很好地概述了为什么你不应该使用 Encoding.Default(感谢 Alexander 的分享)。最好使用 UTF-8,因为大多数系统都可以处理它。

在您的特定情况下,要将文件实际保存为 UTF-8,您必须:

  • 修改创建文件的程序以将其输出为UTF-8

  • 或者,如果您使用文本编辑器创建文件,请使用支持 UTF-8 编码的文本编辑器(例如 Notepad++)。