问题
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];
}
网友评论