UILabel的表情符号

时间:2013-06-20 19:19:31

标签: asp.net objective-c ios6 unicode

enter image description here我一直试图找到解决问题的方法,但没有成功。我知道它可能是愚蠢的,因为我还是对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作为文字。我知道它可能只是一个编码问题,但我不知道在哪里攻击它。

任何帮助将不胜感激。 :)

4 个答案:

答案 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并从那里调用密钥。