使用unicode字符查找NSString的子字符串范围

时间:2015-02-20 06:36:06

标签: ios objective-c unicode nsstring

如果我有这样的字符串。

NSString *string = @"1357"

要获得像@"35"这样的子字符串,您必须考虑笑脸字符需要两个字节的事实。

NSString *substring = [string substringWithRange:NSMakeRange(5, 4)];

在这种情况下,有没有办法通过使用实际字符索引来获取相同的子字符串NSMakeRange(3, 3)

2 个答案:

答案 0 :(得分:0)

快速扩展NSString并使用新的swift String结构。有一个漂亮的String.Index使用字形来计算字符和范围选择。非常有用的是像你这样的情况,包括表情符号

答案 1 :(得分:0)

感谢@ Joe的链接,我能够创建一个有效的解决方案。

对于只是尝试在NSString的unicode字符范围内创建子字符串,这似乎仍然很多。如果您有更简单的解决方案,请发布。

@implementation NSString (UTF)
- (NSString *)substringWithRangeOfComposedCharacterSequences:(NSRange)range
{
    NSUInteger codeUnit = 0;
    NSRange result;
    NSUInteger start = range.location;
    NSUInteger i = 0;
    while(i <= start)
    {
        result = [self rangeOfComposedCharacterSequenceAtIndex:codeUnit];
        codeUnit += result.length;
        i++;
    }

    NSRange substringRange;
    substringRange.location = result.location;
    NSUInteger end = range.location + range.length;
    while(i <= end)
    {
        result = [self rangeOfComposedCharacterSequenceAtIndex:codeUnit];
        codeUnit += result.length;
        i++;
    }   

    substringRange.length = result.location - substringRange.location;
    return [self substringWithRange:substringRange];
}
@end

示例:

NSString *string = @"1357";
NSString *result = [string substringWithRangeOfComposedCharacterSequences:NSMakeRange(3, 3)];   
NSLog(@"%@", result); // 35