Trabajar con puntos de código Unicode en Swift

Si no está interesado en los detalles del mongol pero solo desea una respuesta rápida sobre el uso y la conversión de valores Unicode en Swift, salte a la primera parte delrespuesta aceptada.

Antecedentes

Quiero renderizar texto Unicode paramongol tradicional para ser utilizado en aplicaciones iOS. La mejor solución a largo plazo es usar unFuente inteligente AAT eso representaría este script complejo. (Tales fuentes existen pero su licencia no permite la modificación y el uso no personal.) Sin embargo, dado que nunca he hecho una fuente, y mucho menos toda la lógica de representación para una fuente AAT, solo planeo hacer la representación yo mismo en Swift por ahora. Quizás en una fecha posterior pueda aprender a hacer una fuente inteligente.

Externamente usaré texto Unicode, pero internamente (para mostrar en unUITextView) Convertiré el Unicode en glifos individuales que están almacenados en una fuente tonta (codificada con UnicodePUA valores). Por lo tanto, mi motor de renderizado necesita convertir los valores Unicode de Mongolia (rango: U + 1820 a U + 1842) en valores de glifos almacenados en la PUA (rango: U + E360 a U + E5CF). De todos modos, este es mi plan ya que eslo que hice en Java en el pasado, pero tal vez necesito cambiar mi forma de pensar.

Ejemplo

La siguiente imagen muestrasu escrito dos veces en mongol usando dos formas diferentes para la letrau (en rojo). (El mongol se escribe verticalmente con letras conectadas como letras cursivas en inglés).

En Unicode, estas dos cadenas se expresarían como

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

El selector de variación libre (U + 180B) ensuForm2 es reconocido (correctamente) por SwiftString ser una unidad con elu (U + 1826) que lo precede. Swift lo considera un solo personaje, un grupo de grafemas extendido. Sin embargo, para hacer el renderizado yo mismo, necesito diferenciaru (U + 1826) y FVS1 (U + 180B) como dos puntos de código UTF-16 distintos.

Para fines de visualización interna, convertiría las cadenas Unicode anteriores a las siguientes cadenas de glifos representadas:

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

He estado jugando con SwiftString yCharacter. Hay muchas cosas convenientes sobre ellos, pero dado que en mi caso particular trato exclusivamente con unidades de código UTF-16, me pregunto si debería usar el viejoNSString en lugar de SwiftString. Me doy cuenta de que puedo usarString.utf16 para obtener puntos de código UTF-16, perola conversión de nuevo aString no es muy agradable.

¿Sería mejor quedarse conString yCharacter o debería usarNSString yunichar?

Lo que he leidoDocumentación de cadenas y caracteresCuerdas en SwiftNSString y Unicode

Las actualizaciones de esta pregunta se han ocultado para limpiar la página. Ver el historial de edición.

Respuestas a la pregunta(2)

Su respuesta a la pregunta