Travailler avec des points de code Unicode en Swift

Si vous n'êtes pas intéressé par les détails de la mongolie, mais veulent juste une réponse rapide sur l'utilisation et la conversion des valeurs Unicode dans Swift, puis passer à la première partie de la accepté de répondre à.


Fond

Je veux rendre le texte Unicode pour traditionnel mongol à être utilisé dans des applications iOS. La meilleure solution à long terme est d'utiliser un AAT smart police qui rendrait ce script complexe. (Ces polices n'existe pas mais leur licence n'autorise pas la modification et l'utilisation non personnelle.) Cependant, depuis que je n'ai jamais fait un de la police, sans parler de tous de la logique de rendu pour un AAT de police, j'ai l'intention de faire le rendu moi-même à Swift pour l'instant. Peut-être que plus tard, je peux apprendre à faire une smart police.

De l'extérieur j'utilise Unicode texte, mais en interne (pour l'affichage dans un UITextView) je vais convertir le format Unicode pour glyphes individuels qui sont stockés dans un muet police de caractères (codés en Unicode PUA valeurs). Donc mon moteur de rendu besoins de convertir les mongols valeurs Unicode (gamme: U+1820 à U+1842) glyphe de valeurs stockées dans la PUA (gamme: U+E360, à U+E5CF). De toute façon, c'est mon plan, car il est ce que j'ai fait en Java dans le passé, mais peut-être que j'ai besoin de changer ma façon de penser.

Exemple

L'image suivante montre su écrit deux fois en mongol à l'aide de deux formes différentes de la lettre u (en rouge). (Mongol est écrit verticalement avec des lettres en étant connecté comme des lettres cursives en anglais.)

Travailler avec des points de code Unicode en Swift

En Unicode ces deux chaînes seraient exprimées en

var suForm1: String = "\u{1830}\u{1826}"
var suForm2: String = "\u{1830}\u{1826}\u{180B}"

La Libre Sélecteur de Variante (U+180B) dans suForm2 est reconnu correctement par Swift String être une unité avec le u (U+1826) qui la précède. Il est considéré par Swift pour être un caractère unique, un graphème cluster. Toutefois, pour les fins de faire le rendu moi-même, j'ai besoin de différencier u (U+1826) et FVS1 (U+180B) comme deux distincts de code UTF-16 points.

Internes à des fins d'affichage, je voudrais convertir le au-dessus des chaînes Unicode pour la suite rendus glyphe chaînes:

suForm1 = "\u{E46F}\u{E3BA}" 
suForm2 = "\u{E46F}\u{E3BB}"

Question

J'ai été jouer avec Swift String et Character. Il y a beaucoup de pratique des choses sur eux, mais étant donné que dans mon cas particulier, j'ai traiter exclusivement avec de l'UTF-16 unités de code, je me demande si je devrais être à l'aide de l'ancien NSString plutôt que de Swift String. Je me rends compte que je peux utiliser String.utf16 pour obtenir de code UTF-16 points, mais la conversion vers String n'est pas très agréable.

Serait-il préférable de coller avec String et Caractère ou dois-je utiliser NSString et unichar?

Ce que j'ai lu

Mises à jour à cette question ont été cachés dans le but de nettoyer la page vers le haut. Voir l'historique des modifications.

  • Votre question n'est pas claire pour moi. count(string) donne le nombre de "unicode étendu graphème clusters", count(string.utf16) donne le numéro de code UTF-16 points requis pour la même chaîne (qui est la longueur de la correspondante NSString ou CFString). (Et count(string.utf8) donnerait le nombre de UTF-8 points de code). – La question "dois-je faire quelque chose comme suForm1.utf16 chaque fois que je renvoie une Chaîne de caractères? impossible de répondre en général, cela dépend de ce que vous avez besoin de les compter pour.
  • J'ai besoin de travailler exclusivement (je pense) avec le code UTF-16 points. Le comptage de la longueur d'une chaîne (en UTF-16), c'est une chose que j'ai besoin de le faire, mais c'est seulement un exemple. J'aurai aussi besoin de faire des choses comme comparer des caractères (UTF-16 points de code, pas seulement graphème clusters Swift considère l'égalité). Dois-je utiliser String ou NSString ou autre chose?
  • Qu'entendez-vous par "longueur"... Octets? Unités de Code? Les points de Code? Graphème clusters? Pixels? Et de même pour "comparer"... point de Code à l'égalité? Canonique de l'équivalence? La compatibilité de l'équivalence?
  • De code UTF-16 unités. J'ai réécrit ma question afin d'être plus clair.
  • J'ai ajouté une autre solution possible pour stackoverflow.com/a/24757284/1187415. Vous devriez probablement travailler avec UInt16/unichar des tableaux ou avec NSString comme une représentation intermédiaire. La conversion de NSString de Chaîne est effectivement facile.
InformationsquelleAutor Suragch | 2015-07-07