Подтвердить что ты не робот

Ошибка кодирования: Cocoa Ошибка 261?

Итак, я извлекаю строку JSON из php script в моем приложении 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. Однако, когда я получаю строку 2MB JSON, я получаю:

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

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

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

Кроме того, я не уверен, что это имеет значение, но я использую php function addslashes() для моих проанализированных php-данных для учета кавычек и т.д. при построении строки JSON.

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

Проблема с кодировкой: Cocoa Ошибка 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);

Ответ 4

Для справки в будущем, если вам нужно переопределить кодировку, и вы работаете с потоками без встроенных 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 кодировку.

ИЗМЕНИТЬ

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

Ответ 5

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