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
fa questo aiuto: http://www.cocoadev.com/index.pl?UniCode –
@ jcomeau-ictx, questo documento è fantastico! – xhan