从NSString中指定位置中的UTF8字符

xha*_*han 8 iphone macos objective-c nsstring


    NSString* str = @"1?3?5";
    NSLog(@"%c",[str characterAtIndex:0]); 
    NSLog(@"%c",[str characterAtIndex:1]);  

NSString - characterAtIndex在ASCII字符上运行良好,但是如何在索引2处获得UTF8字符?

- 更新 -
似乎unichar(16bits)不能代表所有UTF8编码字符串(8bites到32bites),所以有没有任何方法从NSString获取char?

CRD*_*CRD 6

不幸的是,戴夫的回答并没有真正做到你想要的.提供rangeOfComposedCharacterSequenceAtIndex的索引是UTF-16代码单元的索引,1或2或者是UTF-16代码点.因此,1如果字符串中的第一个代码点需要2个代码单元,则不是第二个UTF-16代码点...(rangeOfComposedCharacterSequenceAtIndex返回代码点的范围,其中包含给定索引处的代码单元,因此如果您的第一个char需要2代码单元然后传递索引0或1返回相同的范围).

如果要查找可以使用的字符的UTF-8序列UTF8String,然后解析结果字节以查找第n个字符的字节序列.或者你也可以使用rangeOfComposedCharacterSequenceAtIndex从索引0开始并迭代直到你到达第n个字符,然后将1或2个UTF-16代码单元转换为UTF-8代码单元.

我希望我们都缺少一些内容,这是内置的......

一个类别的开始(需要边界检查!)可能会有所帮助:

@interface NSString (UTF)

- (NSRange) rangeOfUTFCodePoint:(NSUInteger)number;

@end

@implementation NSString (UTF)

- (NSRange) rangeOfUTFCodePoint:(NSUInteger)number
{
    NSUInteger codeUnit = 0;
    NSRange result;
    for(NSUInteger ix = 0; ix <= number; ix++)
    {
        result = [self rangeOfComposedCharacterSequenceAtIndex:codeUnit];
        codeUnit += result.length;
    }
    return result;
}

@end
Run Code Online (Sandbox Code Playgroud)

但这种东西是更有效的利用char *而不是NSString