美文网首页
`-[NSString rangeOfCharacterFrom

`-[NSString rangeOfCharacterFrom

作者: 公爵海恩庭斯 | 来源:发表于2018-01-17 15:38 被阅读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];
    }
    

    相关文章

      网友评论

          本文标题:`-[NSString rangeOfCharacterFrom

          本文链接:https://www.haomeiwen.com/subject/lhruoxtx.html