2010-03-21 1 views
3

Я использую nsxmlparser, и мне интересно, как правильно разобрать ISO-8859-1 в NSString.Parsing ISO-8859-1 w/NSXmlParser

В настоящее время я получаю результаты с двухбайтовыми символами.

XML-я использую (не созданный мной) начинается с <?xml version="1.0" encoding="ISO-8859-1"?>

Вот основные вызовов я использую (опущено NSThread вызовов).

NSString *xmlFilePath = [[NSBundle mainBundle] pathForResource:sampleFileName ofType:@"xml"]; 

NSString *xmlFileContents = [NSString stringWithContentsOfFile:xmlFilePath encoding:NSUTF8StringEncoding error:nil]; 

NSData *data = [xmlFileContents dataUsingEncoding:NSUTF8StringEncoding]; 

NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; 

[parser setDelegate:self]; 

[parser parse]; 
+0

Является ли ваш XML-файл UTF-8? – zneak

+0

Это похоже на то, что исходное кодирование может быть, по меньшей мере, частично UTF-8. Я рекомендую опубликовать образец (или ссылку на образец), чтобы он мог быть дополнительно диагностирован. –

+0

Я вижу вверху строку . Я предполагаю, что это кодировка? Как установить NSXmlParser для использования этого? – Ternary

ответ

3

XML specificationрекомендует явную character encoding declaration в документе пролог. У вашего входного документа, вероятно, есть один; который скажет вам кодировку, которую парсер должен использовать для интерпретации ввода символа.

В отсутствие явного объявления, тот же участок говорит рассматривать входные данные как UTF-8 или UTF-16 (и документ с ошибкой, если он оказывается не быть закодирован как любой из них) ,

Итак, если ваш синтаксический анализатор XML либо игнорирует явное объявление кодировки, либо использует неправильную кодировку, если нет явного объявления, ваш синтаксический анализатор Doing It Wrong ™ и должен быть исправлен, чтобы соответствовать спецификации XML.

+0

А, ок. В этом есть смысл. Извините, я немного новичок в этом. Таким образом, в верхней части моего XML-документа находится строка . Это право кодирования? Итак, я должен сказать NSXmlParser это? – Ternary

+0

Обратите внимание, что спецификация XML не требует, чтобы синтаксический анализатор понимал что-либо, кроме UTF-8 и UTF-16 (раздел 2.2). Я никогда не использовал анализирующий XML-анализатор, поэтому я не знаю точно, но это может быть так, что NSXmlParser не поддерживает ничего кроме этого. –

0

Похоже, что ваш заголовок думает, что это ISO-8859-1 и от поведения (в конечном итоге с двумя символами вместо одного), похоже, что хотя бы часть вашего контента уже есть UTF-8. Это похоже на классическую «проблему с кодировкой double utf-8», где контент, уже закодированный как UTF-8, снова закодирован как UTF-8. Измените заголовок, чтобы сказать UTF-8, и он может начать работать. Вы можете попробовать всегда запускать свой код через UTF-8, а затем как то, что он говорит (поскольку, если это не UTF-8, вы получите ошибку анализатора).

Наконец, обратите внимание, что кодировка файла XML переопределяется HTTP-заголовком, если он передается через HTTP.

Не уверен, что это относится к вашей потребности, но я люблю эту статью на parsing XML at all costs. В качестве примера я хотел бы отметить, что я также люблю feedparser (Python) как лучший XML-парсер XML, который стоит всего-навсего (отлично подходит для идей, но не для вашей ситуации).

+0

Отличная информация. Итак, если у меня есть http-ссылка на файл XML, то какой простой способ получить этот файл, загруженный локально, для меня, чтобы посмотреть без HTTP-модификации? Я пробовал в Safari, но еще не нашел его. – Ternary

+0

Для целей отладки я стараюсь использовать либо 'curl', либо' wget' в командной строке и сообщать им, чтобы они отображали заголовки.В браузере я буду использовать Firefox вместе с расширением FireBug, чтобы показать заголовки. Для просмотра содержимого в браузере я просто щелкаю по нему и выбираю «View Source». –