2011-02-24 20 views
8
 

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

NSString gelen konumunu belirtmek?Oku UTF8 karakter bir NSString

- güncellendi -
O unichar görünüyor (16bits) (32bites için 8bites) tüm UTF8 kodlaması dizeleri temsil edemez, bu yüzden NSString gelen kömürü almak için herhangi bir yöntem var mı?

+0

bu yardımı yapar: http://www.cocoadev.com/index.pl?UniCode –

+1

@ jcomeau-ictx, bu belge harika! – xhan

cevap

6

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

4

Daha ayrıntılı yöntemleri kullanmak istiyorum:

NSRange rangeOfSecondCharacter = [str rangeOfComposedCharacterSequenceAtIndex:1]; 
NSString *secondCharacter = [str substringWithRange:rangeOfSecondCharacter]; 

... elbette doğru sınırları ve aralık kontrol ile. Bunun bir NSString, bir nesne, bir unichar veya başka bir ilkel veri türü vermediğini unutmayın.

+0

uygun sonuç elde etmenin tek yolu gibi görünüyor. teşekkürler, lanet olsun NSString'den nefret ediyorum. – xhan

+0

Üzgünüm, kodunuzu test etmeden önce cevabınızı kabul etmedim: D – xhan

0

Neden böyle bir şey kullanmaya kalkmayın:

const char *yourWantedCharacter = [[yourSourceString substringWithRange:yourRange] UTF8String]; 

burada yourSourceString için NSString amacı, yourRange yer parametresi ve '0' (sıfır) bir uzunluk parametresi olarak gerekli karakter indeksli bir NSRange amacıdır.