Повторное кодирование NSString возвращает ноль - PullRequest
0 голосов
/ 05 октября 2010

Итак, у меня есть этот кусок кода:

if ([receivedPage hasPrefix:[NSString stringWithUTF8String:"\xC3\xAF\xC2\xBB\xC2\xBF"]]) // UTF-8 BOM 'EF BB BF' as UTF-16 chars
    {
        //DebugLog(@"converting calls list to UTF8");
        receivedPage = [[[NSString alloc] initWithData:[receivedPage dataUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding] autorelease];
    }

Однако иногда, когда значение if равно true, полученныйPage становится нулевым. с чего бы это случилось?

Полученная страница является возвращенным значением этой функции:

 NSURLResponse * response;
    NSData * result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:error];

    if ([result length] > 0)
        return [[[NSString alloc] initWithBytes: (const void*)[result bytes] length:[result length] encoding: encoding] autorelease];
    else
    {
        if (error && *error)
            DebugLog(@"URL request got error: %@",*error);
        return nil;
    }

Кодировка здесь - NSISOLatin1StringEncoding (не знаю почему, я отлаживаю чужой код).

Есть идеи, почему это произойдет?

1 Ответ

0 голосов
/ 06 октября 2010

Похоже, вы пытаетесь обработать строки (объекты, содержащие символы) как данные (объекты, содержащие байты).Сохраните данные, которые вы получили от соединения, и проверьте в нем спецификацию UTF-8 (правильную трехбайтовую версию), затем используйте NSUTF8StringEncoding или NSISOLatin1StringEncoding в зависимости от того, найдете ли вы ее.

Или, просто используйте UTF-8 условно, если вы можете исправить сервер, чтобы сделать то же самое.

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

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