`-[NSString rangeOfCharacterFromSet:options:NSBackwardsSearch]` failed with Emoji

问题

NSString * wbt_rightTrimmedString(NSString *string)
{
    NSRange range = [string rangeOfCharacterFromSet:[NSCharacterSet whitespaceAndNewlineCharacterSet].invertedSet options:NSBackwardsSearch];
    
    return [string substringToIndex:range.location + 1];
}

这个方法在字符串最后一个非空格字符为 Emoj 符号时会失效

NSString *s = @"adffaf🉐️✅😄      ";
NSString *r = wbt_rightTrimmedString(s);
NSLog(@"(%@)", s); // (adffaf🉐️✅😄      )
NSLog(@"(%@)", r); // (adffaf🉐️✅)

解决方案

待优化:

NSString * _wbt_rightTrimmedString(NSString *string)
{
    char *tempStr = (char *)[string UTF8String];
    size_t realLength = 0;
    for (size_t a = strlen(tempStr);a > 0; a--) {
        if (isspace(tempStr[a-1])) {
            continue;
        }
        else
        {
            realLength = a;
            break;
        }
    }
    
    tempStr[realLength] = '\0';
    
    return [[NSString alloc]initWithUTF8String:tempStr];
}
NSString *s = @"adffaf🉐️✅😄      ";
NSString *r = _wbt_rightTrimmedString(s);
NSLog(@"(%@)", s); // (adffaf🉐️✅😄      )
NSLog(@"(%@)", r); // (adffaf🉐️✅😄)

最新进展

其实是 wbt_rightTrimmedString 函数写的不对,rangeOfCharacterFromSet 返回了 range.length,Emoji 的 length 是 2,而普通字符的 length 是 1。之前默认按 1 处理了,这里应该以 range 的 length 为准。

NSString * wbt_rightTrimmedString(NSString *string)
{
    NSRange range = [string rangeOfCharacterFromSet:[NSCharacterSet whitespaceAndNewlineCharacterSet].invertedSet options:NSBackwardsSearch];

    return [string substringToIndex:range.location + range.length];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容