2013-02-11 1 views
4

Dans Objective-c ...Vérifier gamme de la valeur Unicode d'un caractère

Si j'ai un caractère comme « Δ » comment puis-je obtenir la valeur unicode et déterminer si elle est dans une certaine plage de valeurs .

Par exemple, si je veux savoir si un certain caractère est dans la gamme unicode de U+1F300 à U+1F6FF

+1

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

+0

@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? –

+1

'unichar' est un type de données. Voir la méthode 'NSString characterAtIndex:'. – rmaddy

Répondre

2

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:

  1. 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.

  2. 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.

  3. Utilisez une bibliothèque comme ICU.

+0

Merci beaucoup pour les liens! –

Questions connexes