gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 05:36:53 25 4
gpt4 key购买 nike

我正在使用 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 中显示为两个字符。

既然要格式化hashtag,就应该使用更动态的方式获取start和length值。使用 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];
}

关于ios - 带有 EMOJI 的文本字符串导致 NSRange 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15312508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com