Почему xmltextreader автоматически преобразует символы utf8 в кодировке html в строку utf8?

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

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

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

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

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

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

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

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

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


person AcidRaZor    schedule 22.07.2010    source источник


Ответы (1)


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

Проблема в том, что &quot; - это экранирующий символ 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);
person ParmesanCodice    schedule 22.07.2010
comment
В этом есть смысл. Я смотрел на данные почти 12 часов и не заметил этого! Проблема в том, что данные предоставляются мне, поэтому я не могу внести в них какие-либо изменения, если я не напишу что-то для изменения амперсанда, как указано. Что меня поразило, так это то, что они тоже используются в тексте. SecurityElement.Escape, похоже, работает, однако для ─ он, похоже, не понимает, что это UTF-8, и обрабатывает его как ASCII, даже если MySQL не согласен. - person AcidRaZor; 22.07.2010
comment
Близко, но не сигара. Он по-прежнему ошибается с такими символами, как ā (который был правильно закодирован, за исключением, как вы указали, не с помощью). Таким образом, метод SecurityElement.Escape () не работает. Похоже, что я должен сделать это сам и каким-то образом не заменять действительные в процессе. - person AcidRaZor; 22.07.2010
comment
Благодаря этому наблюдению и комбинации метода, описанного выше, с: Dim txt As New StreamReader (filepath) Dim memoryStream As New MemoryStream () Dim streamWriter As New StreamWriter (memoryStream) streamWriter.Write (txt.ReadToEnd.Replace (, &) .Replace (&,)) streamWriter.Flush () memoryStream.Position = 0 Dim xml As New Xml.XmlTextReader (memoryStream) Мне удалось успешно записать данные! Большое спасибо за то, что указали мне правильное направление! - person AcidRaZor; 22.07.2010