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++)。
我有一个 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++)。