NSString
utilise UTF-16 pour stocker en interne codepoints, donc ceux de la gamme que vous recherchez (U+1F300
à U+1F6FF
) sera stocké comme surrogate pair (quatre octets). Malgré son nom, characterAtIndex:
(et unichar
) ne connaît pas les codes et vous donnera les deux octets qu'il voit à l'index que vous lui donnez (le 55357
que vous voyez est le substitut du code du codepoint dans UTF- 16).
Pour examiner les points de code bruts, vous devez convertir la chaîne/caractères en UTF-32 (qui les code directement). Pour ce faire, vous avez quelques options:
obtenir tous UTF-16 octets qui composent le codepoint, et l'utilisation soit this algorithm ou CFStringGetLongCharacterForSurrogatePair
pour convertir les paires de substitution en UTF-32.
Utilisez soit dataUsingEncoding:
ou getBytes:maxLength:usedLength:encoding:options:range:remainingRange:
pour convertir les NSString
en UTF-32, et interpréter les octets bruts comme uint32_t
.
Utilisez une bibliothèque comme ICU.
Bonne question. C'est trivial si le char est <= "U + FFFF". Utilisez simplement 'unichar'. Je n'ai pas vu une bonne méthode pour les caractères> = 'U + 10000'. – rmaddy
@rmaddy Est-ce que 'unichar' est une méthode pour déterminer quelle est la valeur unicode d'un caractère sous 'U + FFFF' ou est-ce une méthode pour déterminer à quelle distance se trouve une valeur unicode donnée? –
'unichar' est un type de données. Voir la méthode 'NSString characterAtIndex:'. – rmaddy