Objective C中的UTF8字符解码
Posted
技术标签:
【中文标题】Objective C中的UTF8字符解码【英文标题】:UTF8 character decoding in Objective C 【发布时间】:2011-06-22 06:14:13 【问题描述】:我试图在我的 iPhone 上解析来自 json 网络服务的提要,但是 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 表示。现在我真的在修复如何解析这个提要。
【问题讨论】:
完美解决方案***.com/questions/6204718/…恭喜... 【参考方案1】:在经历了很多悲伤之后,我想通了。使用这个。
NSString *correctString = [NSString stringWithCString:[utf8String cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding];
【讨论】:
非常感谢,正是我想要的。 没问题。只是一个警告,我一直有这个解决方案的内存泄漏问题。我认为我用 [NSString stringWithString:(上面的代码)] 修复了 你是救生员。找了这么多小时,我几乎要放弃了。然后,我发现了这段可爱的小代码。非常感谢。这应该是公认的答案。 如果该解决方案适合您,那么您的 JSON 解析器工作不正确,并将传入数据解释为拉丁语 1 而不是 UTF-8。根据您的连接方式,您还应该检查您在 HTTP 标头中获得的内容(尽管NSJSONSerialization
不接受它们,但它首先会得到正确的答案)
你拯救了我的一天。还有晚上!非常感谢!【参考方案2】:
我认为测试用例坏了;以下:
NSString* str1 = @"est un r \u00c3\u00aa ve en noir";
NSLog(@"%@", str1);
还输出“est un r ê ve en noir”。但是,这个:
NSString* str1 = @"est un rêve en noir";
NSLog(@"%@", str1);
输出“est un rêve en noir”,如下所示:
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 解析器需要适应正确解析转义序列。
【讨论】:
同意,如果 json 输出是实际的 utf-8,那就是,? ?【参考方案3】:在 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
【讨论】:
【参考方案4】:发送到服务器时
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];
这对我有用!
【讨论】:
以上是关于Objective C中的UTF8字符解码的主要内容,如果未能解决你的问题,请参考以下文章