почему xmltextreader автоматически преобразует символы utf8 в кодировке html в строку utf8? - PullRequest
3 голосов
/ 22 июля 2010

Я получаю файл XML с кодировкой «ISO-8859-1» (Latin-1)

В файле (среди других тегов) у меня есть <OtherText>Example &quot;content&quot; And &#9472;</OtherText>

Теперь по какой-то причине, когда я загружаю это в XMLTextReader и выполняю «XmlReader.Value», чтобы вернуть значение, он возвращает: «content» И ─

Это тогда, когда сталкивается с базой данных, принимающей только кодировку Latin-1, очевидно ошибки.

Я пробовал следующее:

  • Преобразование в байты и использование Encoding.Convert для изменения из UTF-8 в латынь-1 (который успешно дает мне кучу "?" вместо этого)
  • Использование StreamReader (файл, кодирование. любой ) загрузить файл в XmlTextReader

И несколько вариантов и различных методов в Интернете и на StackOverflow istelf.

Я понимаю, что строки .NET - это UTF-16, но я не понимаю, почему XML-файл, полностью отформатированный в формате Latin-1, с ПРАВИЛЬНОЙ разметкой для символов UTF-8, который совместим со старыми базами данных И web (для разметки HTML и т. д.), что он просто переопределяет это и выводит в любом случае строку в кодировке UTF-8.

Есть ли сейчас способ обойти это, кроме написания моего собственного анализатора текста ???

1 Ответ

3 голосов
/ 22 июля 2010

Я не верю, что это проблема с кодировкой. То, что вы видите, это то, что строка XML не экранирована.

Проблема в том, что &quot; является escape-символом XML, поэтому XMLTextReader отключит его для вас.

Если вы измените это:

<OtherText>Example &quot;content&quot; And &#9472;</OtherText>

К этому:

<OtherText>Example &amp;quot;content&amp;quot; And &amp;#9472;</OtherText>

Тогда

   XmlReader.Value = "&quot;content&quot; And &#9472;";

Вам нужно будет обернуть ваше значение в CDATA, чтобы оно было проигнорировано синтаксическим анализатором.

Другой вариант - снова экранировать строку:

    using System.Security;
....
....
    string val = SecurityElement.Escape(xmlReader.Value);
...