繁体   English   中英

带有EMOJI的文本字符串导致NSRange出现问题

[英]Text string with EMOJI causing issues with NSRange

我正在使用TTTAttributedLabel将格式应用于文本,但它似乎崩溃,因为我试图将格式应用于包含表情符号的范围。 例:

NSString *text = @"@user1234 🍺🍺 #hashtag"; // text.length reported as 22 by NSLog as each emoji is 2 chars in length
cell.textLabel.text = text;

int length = 8;
int start = 13;

NSRange *range = NSMakeRange(start, length);

if (!NSEqualRanges(range, NSMakeRange(NSNotFound, 0))) {
    // apply formatting to TTTAttributedLabel
    [cell.textLabel addLinkToURL:[NSURL URLWithString:[NSString stringWithFormat:@"someaction://hashtag/%@", [cell.textLabel.text substringWithRange:range]]] withRange:range];
}

注意:我从API传递NSRange值,以及文本字符串。

在上面我试图将格式应用于#hashtag。 通常这样可以正常工作,但因为我有表情符号中涉及的表情符号,我相信识别的范围是试图格式化表情符号,因为它们实际上是UTF值,这在TTTAttributedLabel中导致崩溃(它实际上挂起而没有崩溃,但是。 ..)

奇怪的是,如果有1个表情符号,它可以正常工作,但如果有2个表情符号则会中断。

任何人都可以帮我弄清楚该做什么?

问题是,Unicode值为\\ U10000或更高的字符串中的任何Unicode字符都将显示为NSString两个字符。

由于您要格式化主题标签,因此应使用更加动态的方式来获取起始值和长度值。 使用NSString rangeOfString查找#字符的位置。 使用该结果和字符串的长度来获得所需的长度。

NSString *text = @"@user1234 🍺🍺 #hashtag"; // text.length reported as 22 by NSLog as each emoji is 2 chars in length
cell.textLabel.text = text;

NSUInteger start = [text rangeOfString:@"#"];
if (start != NSNotFound) {
    NSUInteger length = text.length - start;
    NSRange *range = NSMakeRange(start, length);
    // apply formatting to TTTAttributedLabel
    [cell.textLabel addLinkToURL:[NSURL URLWithString:[NSString stringWithFormat:@"someaction://hashtag/%@", [cell.textLabel.text substringWithRange:range]]] withRange:range];
}

我假设这是来自Twitter API,你试图使用他们返回的实体字典。 我刚刚编写代码来支持处理这些范围以及NSString的字符串范围版本。

我的方法是“修复”Twitter返回以应对额外字符的实体字典。 由于各种原因,我无法共享代码,但这就是我所做的:

  1. 制作实体字典的深层可变副本。
  2. 遍历字符串,整个范围内unicharunichar ,这样做:
    1. 检查unichar是否在代理对范围内( 0xd800 - > 0xdfff )。
    2. 如果它是代理对码点,则遍历实体字典中的所有条目,如果它们大于字符串中的当前位置(就unichar而言),则将索引移动1。 然后将循环计数器递增1以跳过此代理对的伙伴,因为它现在已被处理。
    3. 如果它不是代理对,那么什么也不做。
  3. 循环遍历所有实体并检查它们是否都不会超出字符串的末尾。 他们不应该,但只是抱怨。 我发现了一些Twitter返回duff数据的案例。

我希望有所帮助! 我也希望有一天我能开源这段代码,因为我觉得它非常有用!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM