NSString initWithData返回nil

时间:2011-06-29 09:54:41

标签: iphone xcode nsstring nsurlconnection nsdata

我在服务器上工作。我向服务器发送请求,它以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“, ”姓名“:” \ u043f \ u0440 \ u043e \ u0438 \ u0441 \ u0448 \ u0435 \ u0441 \ u0442 \ u0432 \ u0438 \ u0435" ,“IC

当我使用NSNonLossyASCIIStringEncoding转换时,我得到类似的内容:

  

XT “:” “ ”newstype“:[{ ”ID“: ”1“, ”名称“: ”происшествие“,” IC

但有时候,使用NSNonLossyASCIIStringEncoding转换,我会收到错误。我不知道为什么

4 个答案:

答案 0 :(得分:0)

您说您的服务器发送以UTF-8编码的数据,但在您的代码中,您使用ASCII解码它。 将编码设置为NSUTF8StringEncoding。

答案 1 :(得分:0)

我认为您可能需要在数据中附加终止“0”。

来自我的一个项目:

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

   // etc your usual code here
}

然后像往常一样使用正确的编码。

答案 2 :(得分:0)

我不知道为什么会发生这种错误。我这样修好了:

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

答案 3 :(得分:0)

我在使用RestKit时遇到了同样的问题。方法[response bodyToString]无法使用西里尔语编码。我通过切换到NSWindowsCP1251StringEncoding来解决它。