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.
AntecedentesQuiero 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.
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}"
PreguntaHe 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
?
Las actualizaciones de esta pregunta se han ocultado para limpiar la página. Ver el historial de edición.