2010-10-05 2 views
0

Так что этот кусок кода:Re-кодирующая NSString возвращает нуль

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]; 
    } 

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

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

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 (не знаю почему, я отладки чужой код).

Любая идея, почему это произойдет?

ответ

0

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

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

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

Смежные вопросы