Проблема с кодировкой: ошибка какао 261? - PullRequest
20 голосов
/ 19 декабря 2009

Итак, я извлекаю строку JSON из php-скрипта в приложении для iPhone, используя:

NSURL *baseURL = [NSURL URLWithString:@"test.php"];
NSError *encodeError = [[NSError alloc] init];
NSString *jsonString = [NSString stringWithContentsOfURL:baseURL encoding:NSUTF8StringEncoding error:&encodeError];
NSLog(@"Error: %@", [encodeError localizedDescription]);
NSLog(@"STRING: %@", jsonString);

Строка JSON проверяется, когда я проверяю вывод. Теперь у меня проблема с кодировкой. Когда я получаю одну строку эха, такую ​​как:

{ "testKey":"é" }

Парсер JSON работает нормально, и я могу создать действительный объект JSON. Тем не менее, когда я получаю 2-мегабайтную строку JSON, я получаю:

Error: Operation could not be completed. (Cocoa error 261.)

и пустая строка. Мой PHP-файл сам по себе является UTF8, и я не использую utf8_encode (), потому что кажется, что он дважды кодирует данные, поскольку я уже извлекаю данные как NSUTF8StringEncoding. В любом случае, в моем тесте с одиночным эхом, именно этот подход позволил мне успешно регистрировать экранирование в стиле \ ASDAS UTF8 при создании объекта JSON.

Что может быть причиной ошибки в случае большей строки?

Кроме того, я не уверен, имеет ли это значение, но я использую функцию php addlashes () в моих проанализированных данных php для учета кавычек и т. Д. При построении строки JSON.

Ответы [ 5 ]

27 голосов
/ 26 января 2011

Я удивлен, что никто не упомянул использование другого значения кодировки вместо NSUTF8StringEncoding при вызове [NSString stringWithContentsOfFile: encoding: error:].

Я также получил ошибку Какао 261 при разборе файла JSON. Я просто просматривал список кодировок NSString , пока не сработал. К счастью, у меня сработал первый: NSASCIIStringEncoding!

Вы также можете использовать NSString stringWithContentsOfFile: usedEncoding: error: , чтобы попытаться найти правильную кодировку (как описано здесь: Как использовать stringWithContentsOfURL: encoding: error:? ).

19 голосов
/ 21 мая 2010

Не знаю, в этом ли ваша проблема, но у меня просто была похожая вещь (stringWithContentsOfFile, без JSON), и проблема заключалась в том, что в файле были CRLF (windows) окончания строк и Western-как ни назывался кодирование. Я использовал SubEthaEdit для конвертации в LF (окончания строк Mac / Unix) и кодировки UTF-8, и теперь все работает нормально.

5 голосов
/ 29 июля 2012

Проблема кодирования: ошибка какао 261? Я решил эту проблему, попробовав другую кодировку. Сначала я использовал NSUTF8, затем я переключился на NSASCIIStringEncoding, и он работал .

NSString* path = [[NSBundle mainBundle] pathForResource: @"fileName" ofType: @"type"];
NSData* data = [NSData dataWithContentsOfFile:path];
NSString *string = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSLog(@"%@",string);
0 голосов
/ 10 мая 2011

Что мне помогло, так это просто изменить физическую кодировку файлов на UTF-8. Мой редактор установил его по умолчанию, MacRoman, и ему не нравились буквы с акцентами.

0 голосов
/ 19 декабря 2009

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

NSHTTPURLResponse* resp=nil;
NSData* jsonAsImmutableData = [NSURLConnection sendSynchronousRequest:
  [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://<whatever>"]]
  returningResponse:&resp error:NULL];

NSMutableData*modifiedData = [NSMutableData dataWithData:jsonAsImmutableData];

char extraNulls[7] =
  {0,0,0,0,0,0,0}; // is this defensive enough for your encoding?
[modifiedData appendBytes:extraNulls length:7];

NSString* jsonAsString = [NSString stringWithCString:[modifiedData bytes]
  encoding:<whatever your encoding is>];

Но я ожидаю, что ваш лучший способ - проверить, использует ли ваш сервер кодировку UTF-8 или какую-либо другую кодировку, поддерживаемую Apple iPhone.

EDIT

измененный код комментария.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...