Исправление кодировки в большом XML-файле - PullRequest
0 голосов
/ 15 декабря 2010

Я импортирую данные из файлов XML, содержащих контент такого типа:

<FirstName>™MšR</FirstName><MiddleName/><LastName>HšNER™Z</LastName>

XML загружается через:

 XmlDocument doc = new XmlDocument();

 try
 {
      doc.Load(fullFilePath);
 }

Когда я выполняюэтот код с данными, содержащимися сверху, я получаю исключение о недопустимом символе.Я прекрасно понимаю эту часть.

Я не уверен, какая это кодировка или как решить эту проблему.Есть ли способ, которым я могу изменить кодировку XmlDocument или другой метод, чтобы убедиться, что вышеуказанный контент анализируется правильно?


Обновление: у меня нет никакого объявления кодировки или <?xml в этом документе,

Я видел, как некоторые ссылки говорят, чтобы добавить его динамически?Это кодировка UTF-16?

Ответы [ 4 ]

3 голосов
/ 16 декабря 2010

Похоже, что:

  • Имя было ÖMÜR HÜNERÖZ (или возможно ÔMÜR HÜNERÔZ или ÕMÜR HÜNERÕZ; я не знаю, что это за язык).
  • Файл XML был закодирован с использованием кодовой страницы DOS «OEM», вероятно, 437 или 850.
  • Но он был декодирован с использованием windows-1252 (кодовая страница «ANSI»).
2 голосов
/ 15 декабря 2010

Если вы посмотрите на файл с помощью шестнадцатеричного редактора (например, HXD или Visual Studio), что именно вы видите?

Представлен ли каждый символ из строки, которую вы опубликовали?одним байтом?Имеет ли файл метку порядка байтов (набор непечатаемых байтов в начале файла)?

Кажется, что ™ и š указывают, что что-то пошло не так с кодированием / преобразованием по пути, но давайте посмотрим ... Я думаю, они оба соответствуют гласной ( O -M- A -R H- A -NER- O -Z, может быть?), Но я еще не выяснил, как они выглядят так ...

Редактировать : dan04 попал в самую голову. in cp-1252 имеет шестнадцатеричное значение 99, а š равно 9a.В cp-437 и cp-850 , hex 99 представляет Ö, а 9a Ü.

Исправление простое: просто укажите эту кодировкуОткрытие вашего XML-файла:

XmlDocument doc = new XmlDocument();

using (var reader = new StreamReader(fileName, Encoding.GetEncoding(437)))
{
   doc.Load(reader);
}
1 голос
/ 15 декабря 2010

С здесь :

Encoding encoding;
using (var stream = new MemoryStream(bytes))
{
    using (var xmlreader = new XmlTextReader(stream))
    {
        xmlreader.MoveToContent();
        encoding = xmlreader.Encoding;
    }
}

Возможно, вы захотите взглянуть на это: Как лучше всего определить кодировку в файле XML?

Для фактического чтения вы можете использовать StreamReader , чтобы позаботиться о спецификации (метка порядка байтов):

string xml;

using (var reader = new StreamReader("FilePath", true))
{                                   //            ↑ 
    xml= reader.ReadToEnd();       //        detectEncodingFromByteOrderMarks
}

Редактировать: Удален параметр кодирования. StreamReader определит кодировку файла, если файл содержит спецификацию. Если этого не произойдет, по умолчанию будет UTF8.

Редактировать 2 : Определение кодировки текста для StreamReader

0 голосов
/ 15 декабря 2010

Очевидно, вы предоставили фрагмент XML-документа, поскольку в нем отсутствует корневой элемент, поэтому я предполагаю, что это было вашим намерением.Есть ли в верхней части инструкция по обработке xml, например <?xml version="1.0" encoding="UTF-8" ?>?

...