2010-01-04 2 views
1

Я читаю XML-файл из веб-службы REST, анализируя его и отображая детали в UITableView. XML-файл закодирован как iso-8859-1 и содержит символы с акцентом. Если я просто добавлю строку в табличное представление, я получаю символ нежелательной почты, поэтому я попытался преобразовать его в UTF8, но он преобразуется в знак вопроса, подразумевая, что он не понимает символ.Отображение символов iso-8859-1 в C# с monotouch

Вот код:

foreach(XmlNode myNode in myNodeList) 
{ 
    Encoding isoEnc = Encoding.GetEncoding ("iso-8859-1"); 

    string utfResult = Encoding.UTF8.GetString (isoEnc.GetBytes(myNode.InnerText)); 

    _myCollection.Add(utfResult); 
} 

Любые идеи, что здесь происходит, и как отображать акцентированные символы?

ответ

2

OK, проблема сейчас решен. Похоже, что моя ошибка предполагала, что StreamReader по умолчанию будет обрабатывать кодировку iso-8859-1. Я изменил свой StreamReader конструктор из:

StreamReader reader = new StreamReader (response.GetResponseStream()); 

к:

StreamReader reader = new StreamReader (response.GetResponseStream(), Encoding.GetEncoding("iso-8859-1")); 

Рассказывая StreamReader ожидать правильную кодировку, все остальное просто становится на свои места.

1

Ну, ваше «преобразование» в UTF-8 очень подозрительно. Вы в основном говорите, что знаете лучше, чем XML-файл, - хотя он утверждает, что является ISO-8859-1, вы действительно знаете, что он был закодирован в UTF-8. У вас есть основания полагать, что это?

Если вы знаете, какими должны быть символы, я предлагаю вам добавить некоторые записи, чтобы указать значения Unicode этих символов (в виде целых чисел) и сравнить их с code charts on Unicode.org. Затем вы узнаете, находится ли ваша проблема в , отображая символы или просматривая их из фида в первую очередь.

+0

Джон, спасибо за это. Я сделал именно это, и похоже, что это в чтении, а не в отображении. XML, определенный с помощью кодирования = «iso-8859-1», но если я построю массив байтов строки, взятой из узла, используя myNode.InnerText, тогда байт будет 3F, который является вопросительным знаком. Если я создам массив юникодов, он возвращает мне FFFD, что является вопросительным знаком в алмазе, что и отображается в UITableView. –

+0

Не создавайте массив байтов из проанализированного XML - посмотрите на сам XML в шестнадцатеричном редакторе. Альтернативный, используйте InnerText, но не преобразовывайте его в массив байтов - переведите первый символ в целое. Обратите внимание, что U + FFFD является символом замены, который предназначен для символов, которые не поддерживаются Unicode. Звучит подозрительно. –

+0

Как добраться. Строка, о которой идет речь, - «Ynys Môn», с акцентированным символом, очевидно, являющимся проблемой в этом случае. Глядя на XML в шестнадцатеричном редакторе, я вижу, что char - это F4, что верно. Если я создаю строку, используя приведенное выше, и отобразите ее в UITableView, тогда она отобразится нормально. Но измельчите char из свойства InnerText этого узла, преобразуйте его в int, он дает 65533 (или U + FFFD). Вот код: char tmpChar = Convert.ToChar (myNode.InnerText.Substring (6, 1)); int charVal = Convert.ToInt32 (tmpChar); Console.WriteLine (charVal); –