Ошибка кодирования NSString в NSData

Я пытаюсь использовать NSXmlParser для анализа данных ISO-8859-1. Используя собственный пример Apple для разбора ISO-8859-1, я получил следующее.

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

// string of xml contents
NSString *xmlFileContents = [NSString stringWithContentsOfFile:xmlFilePath encoding:NSUTF8StringEncoding error:nil];

NSLog(@"contents: %@", xmlFileContents);

Я вижу, что в консоли содержимое строки точное.

Однако, когда я пытаюсь преобразовать его в объект NSData (для использования с анализатором), я делаю следующее.

NSData *xmlData = [xmlFileContents dataUsingEncoding:NSUTF8StringEncoding];

Но затем, когда вызывается мой делегат didStartElement, я вижу Â, что, как мне кажется, связано с несоответствием кодировки.

Может ли NSXmlParser обрабатывать ISO-8859-1, и если да, то что я делаю не так?


person Ternary    schedule 21.03.2010    source источник
comment
Не может NSXMLParser понять кодировку, с которой он имеет дело, из объявления <?xml?>?   -  person zneak    schedule 21.03.2010
comment
Я так думаю. Мой XML начинается с: ‹? Xml version = 1.0 encoding = ISO-8859-1?› И, как я уже сказал, журнал содержимого NSString правильно. Преобразование его в NSData, запуск NSXmlParser и сброс вещей, обнаруженных в didStartElement, дает эти символы в определенных областях.   -  person Ternary    schedule 21.03.2010
comment
Вместо того, чтобы читать файл в NSString и затем преобразовывать его в NSData, это может упростить задачу, просто сделав [NSData dataWithContentsOfFile: xmlFilePath]   -  person David Gelhar    schedule 21.03.2010
comment
Да, я изначально использовал [NSData dataWithContentsOfFile: xmlFilePath] и заметил ложные символы из кодировки ISO. Затем я применил метод NSString, чтобы убедиться, что он правильно считывает его в строку.   -  person Ternary    schedule 22.03.2010


Ответы (1)


На всякий случай, если кто-то еще окажется в этом потоке, пытаясь выяснить, как, черт возьми, получить XML, который начинается с <?xml version="1.0" encoding="ISO-8859-1"?>, правильно прочитанного NSXmlParser, вот что у меня получилось.

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

// string of xml contents (read in NSUTF8StringEncoding)
NSString *xmlFileContents = [NSString stringWithContentsOfFile:xmlFilePath encoding:NSUTF8StringEncoding error:nil];

// interpret string of XML contents as ISO-8859-1 (NSISOLatin1StringEncoding)
NSData *xmlData = [xmlFileContents dataUsingEncoding:NSISOLatin1StringEncoding];

// spawn new thread to parse data
[NSThread detachNewThreadSelector:@selector(parseLineData:) toTarget:self withObject:xmlData];

Чтение содержимого XML как NSUTF8StringEncoding, а затем в NSData как NSUTF8StringEncoding было единственным способом избежать ложных символов Â.

person Ternary    schedule 22.03.2010