我一直试图找到解决问题的方法,但没有成功。我知道它可能是愚蠢的,因为我还是对O形态C的新手,所以这是我的问题。
我正在尝试将unicode表情符号字符实现为UILabel。所以让我们一步一步。
这是我正在使用的Json String:
"body":"\\U0001f61f \\U0001f62e \\U0001f621"
正如你所看到的那样,Json Serializer使用转义unicode。我怀疑这是我的主要问题。
我正在检索这样的数据:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
NSString *concat=[NSString stringWithFormat:@"MYURL?ID=%@",_TID];
NSURL *url = [NSURL URLWithString:concat];
NSData *jsonData=[NSData dataWithContentsOfURL:url];
dispatch_async(dispatch_get_main_queue(), ^{
if (jsonData!=nil) {
newX= [[NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:nil]mutableCopy];
pageCounter=2;
[self.topicView reloadData];
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO; }
[loadingView
performSelector:@selector(removeView)
withObject:nil
afterDelay:1];
});
});
一段时间后,数据被调用并添加到UILabel。
UILabel *emo=(UILabel*)[Tcell viewWithTag:6];
NSString*body=[[[newX objectAtIndex:indexPath.row] valueForKey:@"body"] mutableCopy];
emo.text=body;
这只是给我\ U0001f61f \ U0001f62e \ U0001f621作为文字。我知道它可能只是一个编码问题,但我不知道在哪里攻击它。
任何帮助将不胜感激。 :)
答案 0 :(得分:1)
当你的json字符串是“\ U0001f61f”时,json将\\
理解为表示文字斜杠的转义符。如果希望转义“U”和十六进制数字本身,则应该只使用一个斜杠。
创建如下字符串时:
NSString *s = @"\U0001f61f \U0001f62e \U0001f621";
您可以获得表情符号字符,因为Objective-C编译器理解并将\U
转义符(称为通用字符名称,从C和C ++)转换为字符串文字中的相应字符。如果您使用来自json,plist或字符串 literal 以外的任何字符串,则Objective-C编译器不会在编译时处理转义序列。
注意:请参阅C或C ++语言规范,了解如何在Objective-C或Objective-C ++中处理字符串文字中的转义。
相反,你想使用json理解的转义法在json中创建一个字符串。不幸的是,json缺乏对BMP之外的字符的Unicode支持(即,大于U + FFFF)。 json有一个\u
转义符,但它只支持四个十六进制数字。要将其与BMP之外的字符一起使用,就会出现像使用UTF-16一样使用代理代码点的黑客攻击。
编码所需字符的json字符串是:
"body":"\uD83D\uDE1F \uD83D\uDE2E \uD83D\uDE21"
(如果您使用Google搜索U + 123456格式的Unicode字符,它会找到一个告诉您UTF-16编码的页面。)
希望这是您需要做出的唯一更改,但我不确定NSJSONSerialization
是否支持此黑客攻击。如果这本身不起作用,您需要查看文档(假设行为已记录),以了解NSJSONSerialization
如何从json数据生成字符串数据。
答案 1 :(得分:1)
我使用下面的代码来编码表情符号字符
NSString * uniText = [NSString stringWithUTF8String:[textview.text UTF8String]]; NSData * msgData = [uniText dataUsingEncoding:NSNonLossyASCIIStringEncoding]; NSString * goodMsg = [[NSString alloc] initWithData:msgData encoding:NSUTF8StringEncoding];
以下代码在UILabel中解码和显示
const char * jsonString = [body UTF8String]; NSData * jsonData = [NSData dataWithBytes:jsonString length:strlen(jsonString)]; NSString * goodMsg = [[NSString alloc] initWithData:jsonData encoding:NSNonLossyASCIIStringEncoding];
答案 2 :(得分:0)
要显示这些字符,您需要使用它们有效的字体。在iOS上,这意味着使用Apple Color Emoji
字体。
答案 3 :(得分:0)
所以在花了一整天这么做之后,我找到的唯一解决方案是创建一个NSMutableDictionary并从那里调用密钥。