NSXMLParser + encoding = "windows-1257" - PullRequest
       11

NSXMLParser + encoding = "windows-1257"

0 голосов
/ 06 апреля 2010

Итак, я делаю небольшую программу, и она загружает файл базы данных в формате ziped XML размером ~ 30 МБ (разархивированный). Как я понимаю, есть только один способ с такими большими файлами на iPhone, это использовать NSXMLParser. Но этот файл закодирован в формате windows-1257, и NSXMLParser не использует такие файлы. Что я могу сделать? Есть ли способ изменить кодировку файла на iphone или заставить NSXMLParser работать с другими файлами, кроме UTF8?

Ответы [ 4 ]

0 голосов
/ 06 апреля 2010

Если вы действительно застряли с Windows 1257, выполните сопоставление самостоятельно. Это не так сложно. Эта страница сообщает вам коды символов Unicode для кодов Windows 1257. http://msdn.microsoft.com/fr-fr/goglobal/cc305170%28en-us%29.aspx

Вы можете даже взломать вашу zip-библиотеку, чтобы выполнить преобразование кодировки во время распаковки.

0 голосов
/ 06 апреля 2010

NSXMLParser также может принимать входные данные от объекта NSData, поэтому в некоторых случаях вы можете использовать методы NSString для чтения файла в указанной кодировке и создания NSData в UTF-8.

Что-то вроде:

NSString *str = [NSString stringWithContentsOfFile:myFilePath 
                 encoding:NSWindowsCP1252StringEncoding error:myError];
NSData *XMLData = [str dataUsingEncoding:NSUTF8StringEncoding];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:XMLData];

НО одна проблема: не похоже, что windows-1257 является одной из кодировок, о которых NSString знает о , поэтому вы можете вернуться к «сказать провайдеру использовать UTF-8», если Вы хотите сделать отображение самостоятельно (гадость).

0 голосов
/ 06 апреля 2010

NSXMLParser плохо справляется с большими файлами, поскольку загружает все в память. Вместо этого вам следует подумать о том, чтобы основывать свою реализацию на libxml2, который способен анализировать документ небольшими порциями, что делает его более быстрым и более эффективным в отношении памяти.

Существует отличный пример, показывающий, как это можно реализовать:

Пример XMLPerformance

libxml2 может быть скомпилирован с поддержкой множества различных кодировок, как указано в документации . Однако я не проверял, поддерживается ли Windows-1257 по умолчанию на iPhone.

Claus

0 голосов
/ 06 апреля 2010

Скорее всего, вам придется попросить поставщиков данных предоставить XML в формате UTF-8 в соответствии с мантрой кодировки текста:

Используйте UTF-8. Всегда.

...