Objective C中的UTF8字符解码

时间:2011-02-06 13:12:15

标签: iphone objective-c json utf-8

我正在尝试从我的iPhone上的json webservice解析一个feed但是utf8转换不能正常工作或者我做错了什么 这是饲料的一部分
est un r\u00c3\u00aave en noir

以下是我编写的用于转换上述内容的代码:

NSString* str1 = @"est un r \u00c3\u00aa ve en noir";

NSString* str = [NSString stringWithUTF8String:[str1 cStringUsingEncoding:NSUTF8StringEncoding]];
NSLog(@"Converted UTF   %@",str);

这是我得到的输出:
Converted UTF est un r ê ve en noir

预期输出应为
Converted UTF est un rêve en noir

当我检查UTF表并在线使用utf转换器时,使用相同的代码并使用字符串@"est un r\u00EAve en noir"正确获取输出但我认为如果我没有弄错,则使用UTF16表示。现在我真正解决了如何解析这个feed。

4 个答案:

答案 0 :(得分:39)

悲伤之后,我已经想到了这一点。使用它。

NSString *correctString = [NSString stringWithCString:[utf8String cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding];

答案 1 :(得分:10)

我认为测试案例已经破裂;以下内容:

NSString* str1 = @"est un r \u00c3\u00aa ve en noir";
NSLog(@"%@", str1);

同时输出'est unrêveen noir'。但是,这个:

NSString* str1 = @"est un rêve en noir";
NSLog(@"%@", str1);

输出'estunrêveennoir',同样如下:

NSString* str1 = @"est un rêve en noir";

NSString* str = [NSString stringWithUTF8String:[str1 cStringUsingEncoding:NSUTF8StringEncoding]];
NSLog(@"%@", str);

同样略短的版本:

NSString* str1 = @"est un rêve en noir";

NSString* str = [NSString stringWithUTF8String:[str1 UTF8Encoding]];
NSLog(@"%@", str);

确实:

char *str1 = "est un r\xc3\xaave en noir";

NSString* str = [NSString stringWithUTF8String:str1];
NSLog(@"%@", str);

我认为这是JSON的问题,而不是UTF8。 \ u后跟四个十六进制数字是JSON编码通用UTF16字符的方式,它不是UTF的固有部分。所以NSString不知道如何处理它。您的JSON解析器需要进行调整以正确解析转义序列。

答案 2 :(得分:0)

在iOS 9中,不需要做任何事情。它会自动转换。

   NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request
                                                               fromData:postData completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

                                                                   NSLog(@"response header: %@",response);

                                                                   NSString* aStr;
                                                               aStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                                                               NSLog(@"response data: %@", aStr);

                                                               NSDictionary * json  = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

                                                               for (NSDictionary *dict in json)
                                                               {
                                                                   NSLog(@"%@", dict);
                                                                   NSString *name = [dict objectForKey:@"name"];
                                                                   NSString *msg = [dict objectForKey:@"message"];
                                                                   NSString *topic = [dict objectForKey:@"topic"];
                                                                   NSLog(@"*********** %@, %@, %@", name,topic,msg);

                                                                   // now do something
                                                                   }

答案 3 :(得分:0)

发送到服务器时

NSString* str1 = @"est un r \u00c3\u00aa ve en noir";
    NSData *str1Data = [str1 dataUsingEncoding:NSNonLossyASCIIStringEncoding];
    NSString  *str2 = [[NSString alloc] initWithData:str1Data encoding:NSUTF8StringEncoding];

收到后你可以像这样解码

NSData *recivedStrData = [recivedStr dataUsingEncoding:NSUTF8StringEncoding];
    NSString *strResult = [[NSString alloc] initWithData:recivedStrData encoding:NSNonLossyASCIIStringEncoding];

这对我有用!