問題
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];
}