`-[NSString rangeOfCharacterFrom

2018-01-17  本文已影响59人  公爵海恩庭斯

问题

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];
}
上一篇 下一篇

猜你喜欢

热点阅读