0

在此处输入图像描述我整天都在尝试解决我的问题,但没有成功。我知道这可能很愚蠢,因为我对 OBjective C 还是新手,所以这是我的问题。

我正在尝试将 unicode Emoji Characters 实现到 UILabel 中。所以让我们一步一步来。

这是我正在使用的 Json 字符串:

"body":"\\U0001f61f \\U0001f62e \\U0001f621"

如您所见,我使用的 Json 序列化器转义了 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

4 回答 4

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 长度:strlen(jsonString)]; NSString *goodMsg = [[NSString alloc] initWithData:jsonData encoding:NSNonLossyASCIIStringEncoding];

于 2013-11-11T11:14:01.360 回答
1

当您的 json 字符串为 "\U0001f61f" 时,json 将其理解\\为表示文字斜线的转义。如果您希望“U”和十六进制数字本身被转义,您应该只使用一个斜杠。


当您创建这样的字符串时:

NSString *s = @"\U0001f61f \U0001f62e \U0001f621";

你会得到表情符号字符,因为 Objective-C 编译器理解\U转义符(称为通用字符名称,来自 C 和 C++)并将其转换为字符串文字中的适当字符。如果您使用来自 json 的字符串、plist 或字符串文字以外的任何内容,则 Objective-C 编译器在编译时不会处理转义序列。


注意:请参阅 C 或 C++ 语言规范,了解如何在 Objective-C 或 Objective-C++ 中处理字符串文字中的转义。


相反,您想使用 json 理解的转义在 json 中创建一个字符串。不幸的是,json 对 BMP 之外的字符(即大于 U+FFFF)的 Unicode 支持不足。json 有\u转义,但它只支持四个十六进制数字。要将它与 BMP 之外的字符一起使用,有一个 hack,它涉及使用代理代码点,就像 UTF-16 一样。

对您想要的字符进行编码的 json 字符串是:

"body":"\uD83D\uDE1F \uD83D\uDE2E \uD83D\uDE21"

(如果您使用 Google 使用 U+123456 格式搜索 Unicode 字符,它会找到一个告诉您 UTF-16 编码的页面。)

希望这是您需要进行的唯一更改,但是我不确定是否NSJSONSerialization支持此 hack。如果这本身不起作用,您需要查看文档(假设记录了行为)以了解如何NSJSONSerialization从 json 数据生成字符串数据。

于 2013-06-21T17:46:23.397 回答
0

因此,在花了一整天的时间做这件事之后,我发现的唯一解决方案是创建一个 NSMutableDictionary 并从那里调用密钥。

于 2013-06-20T23:51:59.513 回答
0

要显示这些字符,您需要使用它们有效的字体。在 iOS 上,这意味着使用Apple Color Emoji字体。

于 2013-06-20T19:31:30.687 回答