Странные проблемы с кодировкой UTF-8 при чтении XML и записи результатов на C # - PullRequest
1 голос
/ 08 декабря 2010

У меня проблема с простой программой на C #, которая предназначена для чтения XML-документа из Интернета, извлечения некоторых элементов, а затем записи содержимого этих элементов в файл HTML (в простой таблице).Хотя XML-документы правильно закодированы как UTF-8, в конце концов, все мои сгенерированные HTML-файлы не в состоянии правильно транскрибировать символы не западного английского языка (например, вывод, подобный «Wingdings» при синтаксическом анализе японского языка).

Поскольку файлы XML действительно большие, программа работает с XmlReader, который выдает совпадающие элементы при их обнаружении, которые затем записываются в файл HTML с помощью StreamWriter.

Есть ли у кого-нибудь ощущение того, где впрограмме, подобной этой, кодировка UTF-8 может быть явно принудительной?

1 Ответ

4 голосов
/ 08 декабря 2010

Краткое объяснение

Я собираюсь угадать здесь: Ваш браузер отображает страницу, используя неправильную кодировку символов.

Вам необходимо ответить: Какую кодировку символов использует ваш браузер?HTML есть?(Держу пари, это не UTF-8.)

Попробуйте настроить браузер: например, в Firefox это View → Character Encoding, затем выберите кодировку символов, соответствующую вашему документу.

Поскольку у вас, похоже, очень многоязычный документ, ваш вывод C # должен быть в UTF-8 - который поддерживает все символы, известные человеку, включая японский, китайский, латиницу и т. Д. Затем попробуйте указать Firefox, IE, что угодно, использовать UTF-8.Ваш документ должен отображаться.

Если это проблема, вам нужно сообщить браузеру о кодировке вашего документа.Сделайте это ( смотри это ):

  • Ваш веб-сервер вернет кодировку символов в заголовках HTTP.
  • Указание кодировки символов в <meta> tag.
  • Указание кодировки символов в преамбуле XML для XHTML.

Чем больше вы сделаете, тем лучше.


Длинныйобъяснение

Давайте посмотрим на несколько вещей, которые вы упомянули:

с использованием (StreamWriter sw = новый StreamWriter (outputFile, true, System.Text.Encoding.UTF8)))

и

обнаружили, что при использовании Text.Encoding.Default работали другие западные наборы символов с акцентами (испанские акценты, немецкие умлауты), хотя у японцев по-прежнему возникают проблемы.

Я собираюсь выйти на конечность и сказать, что вы - американский пользователь компьютера.Таким образом, для вас кодировка «по умолчанию» в Windows - это, вероятно, Windows-1252.Кодировка по умолчанию, которую использует веб-браузер, если он не может обнаружить кодировку в документе HTML, - это ISO-8859-1.ISO-8859-1 и Windows-1252 очень похожи, и они оба отображают ASCII плюс некоторые распространенные латинские символы, такие как é, è и т. Д. Более того, акцентированные символы кодируются одинаково, поэтомудля этих символов обе кодировки будут декодировать одни и те же данные.Таким образом, когда вы переключились на «default», браузер правильно декодировал ваши латинские символы, хотя и с неправильной кодировкой.Японский язык не существует ни в ISO-8859-1, ни в Windows-1252, и оба они приведут к тому, что японский язык будет отображаться как случайные символы.(«Мохибаке»)

Тот факт, что вы заметили, что переключение на «по умолчанию» исправляет некоторые символы латинского акцентирования, говорит мне, что ваш браузер использует ISO-8859-1, а это не то, что нам нужно:Мы хотим кодировать текст, используя UTF-8, и нам нужен браузер, чтобы прочитать его обратно как таковой.Смотрите краткое объяснение того, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...