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?
不幸的是,戴夫的回答并没有真正做到你想要的.提供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
| 归档时间: |
|
| 查看次数: |
2947 次 |
| 最近记录: |