NSString initWithData возвращает ноль - PullRequest
1 голос
/ 29 июня 2011

Я работаю с сервером.Я отправляю запрос на сервер, и он отвечает мне в кодировке UTF-8, но когда я пытаюсь декодировать байтовый массив в строку, иногда я получаю значение nil.Как я могу декодировать этот массив байтов без каких-либо ошибок?

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{
    [receivedData appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSString * result_string=[[[NSString alloc] initWithData:receivedData encoding:NSNonLossyASCIIStringEncoding] autorelease];
    NSLog(result_string);
    //...
}

, когда я конвертирую, используя NSUTF8StringEncoding, я получаю что-то вроде этого:

xt ":" "," newstype": [{" id ":" 1 "," name ":" \ u043f \ u043e \ u0438 \ u0448 \ u0435 \ u0441 \ u0442 \ u0432 \ u0432 \ u0435 "," ic

когда я конвертирую, используя NSNonLossyASCIIStringEncoding, я получаю что-то вроде этого:

xt ":" "," newstype ": [{" id ":" 1 "," name ":"происшествие", "ic

, но иногда, конвертируя с помощью NSNonLossyASCIIStringEncoding, я получаю ошибки.Я не знаю почему

Ответы [ 4 ]

0 голосов
/ 29 сентября 2011

Я столкнулся с той же проблемой при использовании RestKit. Метод [response bodyToString] не работал с кодировкой кириллицы. Я решил это, переключившись на NSWindowsCP1251StringEncoding.

0 голосов
/ 29 июня 2011

Я думаю, вам может понадобиться добавить завершающий «0» к вашим данным.

Из одного из моих проектов:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
   char temp[] = {0};
   [receivedData appendBytes:temp length:1];

   // etc your usual code here
}

Затем выполните как обычно с правильной кодировкой.

0 голосов
/ 04 июля 2011

Я не знаю, почему произошла эта ошибка. Я исправил это так:

-(id)init{
    self=[super init];
    if(self){
        NSArray *codes=[NSArray arrayWithObjects:@"\\u0410",@"\\u0411",@"\\u0412",@"\\u0413",@"\\u0414",@"\\u0415",@"\\u0416",@"\\u0417",@"\\u0418",@"\\u0419",@"\\u041a",@"\\u041b",@"\\u041c",@"\\u041d",@"\\u041e",@"\\u041f",
                        @"\\u0420",@"\\u0421",@"\\u0422",@"\\u0423",@"\\u0424",@"\\u0425",@"\\u0426",@"\\u0427",@"\\u0428",@"\\u0429",@"\\u042a",@"\\u042b",@"\\u042c",@"\\u042d",@"\\u042e",@"\\u042f",
                        @"\\u0430",@"\\u0431",@"\\u0432",@"\\u0433",@"\\u0434",@"\\u0435",@"\\u0436",@"\\u0437",@"\\u0438",@"\\u0439",@"\\u043a",@"\\u043b",@"\\u043c",@"\\u043d",@"\\u043e",@"\\u043f",
                        @"\\u0440",@"\\u0441",@"\\u0442",@"\\u0443",@"\\u0444",@"\\u0445",@"\\u0446",@"\\u0447",@"\\u0448",@"\\u0449",@"\\u044a",@"\\u044b",@"\\u044c",@"\\u044d",@"\\u044e",@"\\u044f",
                        @"\\u0401",@"\\u0451",@"\\u00a0",nil];
        NSArray *res=[NSArray arrayWithObjects:@"А",@"Б",@"В",@"Г",@"Д",@"Е",@"Ж",@"З",@"И",@"Й",@"К",@"Л",@"М",@"Н",@"О",@"П",
                                               @"Р",@"С",@"Т",@"У",@"Ф",@"Х",@"Ц",@"Ч",@"Ш",@"Щ",@"Ъ",@"Ы",@"Ь",@"Э",@"Ю",@"Я",
                                               @"а",@"б",@"в",@"г",@"д",@"е",@"ж",@"з",@"и",@"й",@"к",@"л",@"м",@"н",@"о",@"п",
                                               @"р",@"с",@"т",@"у",@"ф",@"х",@"ц",@"ч",@"ш",@"щ",@"ъ",@"ы",@"ь",@"э",@"ю",@"я",
                                               @"Ё",@"ё",@" ",nil];
        dic=[[NSMutableDictionary alloc] initWithObjects:res forKeys:codes];
    }
    return self;
}

-(NSString*)convertToString:(NSString*)str{
    if(str==nil)
        return nil;
    NSString *new_str=str;
    for (NSString *s in [dic allKeys]) {
        new_str=[new_str stringByReplacingOccurrencesOfString:s withString:[dic objectForKey:s]];
    }
    return new_str;
}
0 голосов
/ 29 июня 2011

Вы говорите, что ваш сервер отправляет данные, закодированные в UTF-8, но в своем коде вы декодируете их с помощью ASCII.Установите для кодировки NSUTF8StringEncoding.

...