【问题标题】:Emoji in UILabelUILabel 中的表情符号
【发布时间】:2013-06-20 19:19:30
【问题描述】:

我整天都在尝试解决我的问题,但没有成功。我知道这可能很愚蠢,因为我对 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 作为文本。我知道这可能只是一个编码问题,但我不知道从哪里解决这个问题。

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

【问题讨论】:

  • 标签设置成什么字体?
  • 您需要确定谁首先将 Emoji 字符编码为“\U0001f61f”,然后谁是双转义斜线。它必须是您服务器的一部分。例如,如果您只想发送第一个表情符号,并且您使用 UTF-8 作为输出编码(很可能),正文应该看起来像“\uf09f\u989f”(注意小写 u,并且有两个 UTF-8 字符用于一个表情符号)。
  • 我将这些字符手动存储在 SQL 中,因为它们需要与其他表情符号配对。 ASP.net 处理我认为我正确编码的 JSON 请求。
  • yonosoytu 是正确的。根据JSON RFC,不属于“基本多语言平面”的字符可以使用 UTF-16 代理对进行转义。对于U+U0001f61f,那就是\uD83D\uDE1F。然后这将被 NSJSONSerialization 正确解码。所以在我看来,您的服务器对表情符号的编码不正确。
  • @Anthem127:根据你的图片,有些表情正确显示,有些是<0001f60a>,有些是\U0001f61f。那是对的吗?你能显示jsonData的NSLog输出吗?

标签: asp.net objective-c ios6 unicode


【解决方案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];

【讨论】:

    【解决方案2】:

    当您的 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 之外的字符(即大于 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 数据生成字符串数据。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 所做的只是改变字体样式。 ://
      • 你是否在剥离前导(额外)``?
      • 我尝试使用替换功能并尝试使用stackoverflow.com/a/7935625/870806 niether 工作。我不确定是否必须为 Json 阅读器启用一些 Unicode 过滤器,但我不熟悉 OC。
      • 所以您使用stringByReplacingOccurrencesOfString 将\\ 替换为\ ?
      • body=[body stringByReplacingOccurrencesOfString:@"\\\\" withString:@"\\"];我还有其他几个表情符号字符用作字符串文字,但是一旦我尝试使用来自服务器的 json 字符串中的任何内容,就没有任何效果。
      【解决方案4】:

      所以花了一整天的时间做这件事后,我发现的唯一解决方案是创建一个 NSMutableDictionary 并从那里调用键。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-22
        • 2015-09-12
        • 2014-09-27
        • 1970-01-01
        • 2014-11-07
        • 1970-01-01
        • 1970-01-01
        • 2014-07-17
        相关资源
        最近更新 更多