使用 unicode 字符查找 NSString 的子字符串范围
Posted
技术标签:
【中文标题】使用 unicode 字符查找 NSString 的子字符串范围【英文标题】:Find substring range of NSString with unicode characters 【发布时间】: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 的问题是我是否需要找到相同字符串的不同位置。 Read UTF8 character in specify position from a 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:
或其他名称。重要的是要了解区别。以上是关于使用 unicode 字符查找 NSString 的子字符串范围的主要内容,如果未能解决你的问题,请参考以下文章