【问题标题】:Find substring range of NSString with unicode characters使用 unicode 字符查找 NSString 的子字符串范围
【发布时间】:2015-02-20 06:36:06
【问题描述】:

如果我有这样的字符串。

NSString *string = @"????1????3????5????7????"

要获得像@"3????5" 这样的子字符串,您必须考虑笑脸字符占用两个字节的事实。

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

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

【问题讨论】:

  • 你应该试试 NSRangeFromString(@"3????5")
  • NSString 支持 unicode。只需尝试使用正确的 unicode 文本再次测试。它应该是可读的文本。
  • rangeOfString 的问题是我是否需要找到相同字符串的不同位置。

标签: ios objective-c unicode nsstring


【解决方案1】:

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

【讨论】:

  • 我正在使用 Objective-C。
  • 没问题 Berry 你可以在一个项目中合并两种语言。这很容易
【解决方案2】:

感谢@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 = @"?1?3?5?7?";
NSString *result = [string substringWithRangeOfComposedCharacterSequences:NSMakeRange(3, 3)];   
NSLog(@"%@", result); // 3?5

【讨论】:

  • 需要明确的是,组合字符序列与代码点不同。你的方法被误导了。
  • 如果您可以编辑并建议一个更好的名称,那就太好了。
  • 嗯,你可以称它为-substringWithRangeOfComposedCharacterSequences: 或其他名称。重要的是要了解区别。
猜你喜欢
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-27
  • 2019-06-04
相关资源
最近更新 更多