Ne yazık ki Dave'in cevabı aslında ne yapmak istemiyor. rangeOfComposedCharacterSequenceAtIndex
'a verilen dizin, UTF-16 kod biriminin 1 veya 2 kodlu indeksidir veya UTF-16 kod noktası yapar. Bu nedenle, dizideki ilk kod noktası 2 kod birimi gerektiriyorsa 1
ikinci UTF-16 kod noktası değildir ... (rangeOfComposedCharacterSequenceAtIndex
, belirtilen dizindeki kod birimini içeren kod noktasının aralığını döndürür. 2 kod birimi gerektirir, daha sonra 0 veya 1 indeksini geçirirse aynı aralığı döndürür).
Bir karakter için UTF-8 dizisini bulmak istiyorsanız, UTF8String
öğelerini kullanabilir ve daha sonra, nth karakteri için bayt dizisini bulmak için sonuç baytları ayrıştırabilirsiniz. Veya rangeOfComposedCharacterSequenceAtIndex
'u 0 dizininden başlayıp nth karakterine ulaşıncaya kadar yineleyebilir, sonra 1 veya 2 UTF-16 kod ünitelerini UTF-8 kod birimlerine dönüştürebilirsiniz.
Hepimizin şey eksik umuyorum
ve bu yerleşik bir ...
Bir başlangıç (sınırları denetleme ihtiyacı var!) Yardımcı olabilecek bir kategorinin:
@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
ama bu tür şeyler ziyade char *
kullanarak daha verimlidir ait NSString
bu yardımı yapar: http://www.cocoadev.com/index.pl?UniCode –
@ jcomeau-ictx, bu belge harika! – xhan