Вопрос

Ошибка NSXMLParserInvalidCharacterError # 9

Это ошибка, которую я получаю, когда нажимаю на странный символ (например, кавычки, скопированные и вставленные из word в веб-форму, которые в конечном итоге попадают в ленту).Канал, который я использую, не дает кодировки, и у меня нет надежды заставить их изменить это.Это все, что я получаю в заголовке:

< ?версия xml="1.0"?> < версия rss="2.0">

Что я могу сделать с недопустимыми символами при разборе каналов?Просматриваю ли я данные перед анализом?Есть ли что-то, чего мне не хватает в API?Кто-нибудь сталкивался с этой проблемой?

Это было полезно?

Решение

NSString *dataString = [[[NSString alloc] initWithData:webData encoding:NSASCIIStringEncoding] autorelease];

NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

Устранил мои проблемы...

Другие советы

В NSString -initWithData:encoding: метод возвращает nil если это не удастся, вы можете пробовать одну кодировку за другой, пока не найдете ту, которая преобразует.Это не гарантирует, что вы правильно преобразуете все символы, но если ваш источник канала отправляет вам неправильно закодированный XML-файл, то вам, вероятно, придется смириться с этим.

Основная идея заключается в том,:

// try the most likely encoding
NSString xmlString = [[NSString alloc] initWithData:xmlData 
                                           encoding:NSUTF8StringEncoding];

if (xmlString == nil) {
  // try the next likely encoding
  xmlString = [[NSString alloc] initWithData:xmlData 
                                     encoding:NSWindowsCP1252StringEncoding];
}

if (xmlString == nil) {
  // etc...
}

Чтобы быть универсальным и надежным, вы могли бы делать следующее до тех пор, пока не добьетесь успеха:

1.) Попробуйте кодировку, указанную в заголовке Content-Type HTTP-ответа (если таковой имеется).

2.) Проверьте начало данных ответа на наличие знак порядка байтов и если найдено, попробуйте указанную кодировку

3.) Посмотрите на первые два байта;если вы обнаружите пробел или '<' в паре с символом nul / ноль попробуйте UTF-16 (аналогично, вы можете проверить первые четыре байта, чтобы увидеть, есть ли у вас UTF-32)

4.) Сканируйте начало данных в поисках <?xml ... ?> инструкция по обработке и поиск encoding='something' внутри него;попробуйте эту кодировку.

5.) Попробуйте некоторые распространенные кодировки.Обязательно проверьте Windows Latin-1, Mac Roman и ISO Latin-1, если ваш источник данных на английском языке.

6.) Если ничего из вышеперечисленного не работает, вы могли бы попробовать удалить все байты, превышающие 127 (или заменить '?' или другим символом ASCII) и преобразовать данные, используя кодировку ASCII.

Если к этому моменту у вас еще нет NSString, вы должны потерпеть неудачу.Если у вас действительно есть NSString, вам следует поискать encoding декларация в <?xml ... ?> инструкция по обработке (если вы этого еще не сделали на шаге 4).Если он есть, вы должны преобразовать NSString обратно в NSData, используя эту кодировку;если его там нет, вы должны преобразовать обратно, используя кодировку UTF-8.

Кроме того, в CFStringConvertIANACharSetNameToEncoding() и CFStringConvertEncodingToNSStringEncoding() функции могут помочь получить NSStringEncoding, который соответствует имени кодировки, из Content-Type заголовок или <?xml ... ?> инструкция по обработке.

Вы также можете удалить эту строку кодировки из xml следующим образом:

int length = str.length >100 ? 100:str.length;
NSString*mystr= [str stringByReplacingOccurrencesOfString:@"encoding=\".*?\"" 
                        withString:@""
                        options:NSRegularExpressionSearch 
                        range:NSMakeRange(0, length)];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top