2011-02-24 11 views
8
 

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

NSString - characterAtIndex funziona bene su caratteri ASCII, ma come ho potuto ottenere il carattere UTF-8 in corrispondenza dell'indice di 2?carattere letto UTF8 a specificare la posizione da un NSString

- aggiornato -
Sembra UNICHAR (16 bit) non può rappresentare tutte le stringhe di codifica UTF-8 (8bites a 32bites), quindi ci sono un metodo per ottenere il carattere da NSString?

+0

fa questo aiuto: http://www.cocoadev.com/index.pl?UniCode –

+1

@ jcomeau-ictx, questo documento è fantastico! – xhan

risposta

6

Purtroppo la risposta di Dave in realtà non fa quello che vuoi. L'indice fornito a rangeOfComposedCharacterSequenceAtIndex è un indice di un'unità di codice UTF-16, 1 o 2 o che crea un punto di codice UTF-16. Quindi, 1 non è il secondo punto di codice UTF-16 se il primo punto di codice nella stringa richiede 2 unità di codice ... (rangeOfComposedCharacterSequenceAtIndex restituisce l'intervallo del punto di codice che include l'unità di codice all'indice dato, quindi se il tuo primo carattere richiede 2 unità di codice quindi passare un indice di 0 o 1 restituisce lo stesso intervallo).

Se si desidera trovare la sequenza UTF-8 per un carattere, è possibile utilizzare UTF8String e quindi analizzare i byte risultanti per trovare la sequenza di byte per l'ennesimo carattere. Oppure puoi anche usare rangeOfComposedCharacterSequenceAtIndex iniziando dall'indice 0 e iterare fino ad arrivare all'ennesimo carattere, quindi convertire le 1 o 2 unità di codice UTF-16 in unità di codice UTF-8.

spero siamo tutti manca qualcosa, e questo è built-in ...

Un inizio (ha bisogno di controllo dei limiti!) Di una categoria che potrebbe aiutare:

@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 

ma questo tipo di roba è più efficiente utilizzando char * piuttosto che NSString

4

usereste i metodi più dettagliati:

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

... con limiti adeguati e controllo gamma, naturalmente. Tieni presente che questo ti dà un NSString, un oggetto, non un unichar o un altro tipo di dati primitivi.

+0

sembra che sia l'unico modo per ottenere risultati corretti. grazie, dannazione odio NSString. – xhan

+0

scusa, non ho ancora testato i codici prima di accettare la tua risposta: D – xhan

0

Perché non si tenta di utilizzare qualcosa di simile:

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

dove yourSourceString e l'oggetto NSString, yourRange è un oggetto NSRange con l'indice del carattere necessario come il parametro di posizione e un parametro di lunghezza '0' (zero).

Problemi correlati