Десериализация XML Unicode - PullRequest
0 голосов
/ 16 мая 2018

У меня есть 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 кодировка , но я использовал некоторые не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;
}

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

Это работает для меня:

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; }
}
0 голосов
/ 16 мая 2018

Кажется, что ваш файл не закодирован как UTF-8, а по умолчанию используется ANSI кодировкой Windows.

Определение StreamReader как

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

должен сделать трюк.


Обратите внимание, что это скорее обходной путь, и использование Encoding.Default на самом деле очень плохая идея, поскольку она сломается при использовании другой Культуры. Эта статья дает хороший обзор, почему вы не должны использовать Encoding.Default (спасибо Александру за обмен). Лучше использовать UTF-8, так как большинство систем могут справиться с этим.

В вашем конкретном случае, чтобы фактически сохранить файл как UTF-8, вы должны:

  • Адаптировать программу, которая создает файл, для вывода его в формате UTF-8

  • Или, если вы использовали текстовый редактор для создания файла, используйте текстовый редактор, который поддерживает кодировку UTF-8 (например, Notepad ++).

0 голосов
/ 16 мая 2018

Вы можете использовать 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", я использую это в основном для иностранных символов

...