Если вас не интересуют детали монгольского языка, но просто хочу получить быстрый ответ об использовании и преобразовании значений Unicode в Swift, перейдите к первой части принятого ответа .
Фон
Я хочу сделать текст Unicode для традиционного монгола, который будет использоваться в приложениях iOS. Лучшим и долгосрочным решением является использование умного шрифта AAT, который будет отображать этот сложный script. (Такие шрифты существуют, но их лицензия не позволяет изменять и нелично использовать.) Однако, поскольку я никогда не делал шрифта, не говоря уже о вся логика рендеринга шрифта AAT, я просто планирую сделать рендеринг в Swift на данный момент. Может быть, в какой-то более поздний срок я могу научиться делать умный шрифт.
Внешне я буду использовать текст Unicode, но внутренне (для отображения в UITextView
) я преобразую Unicode в отдельные глифы, которые хранятся в негромном шрифте (кодируется с помощью Unicode значения PUA). Поэтому мой движок рендеринга должен преобразовать значения монгольского Unicode (диапазон: U + 1820 в U + 1842) в значения глифов, хранящиеся в PUA (диапазон: U + E360 до U + E5CF). Во всяком случае, это мой план, поскольку что я делал в Java в прошлом, но, возможно, мне нужно изменить весь мой образ мышления.
Пример
Следующее изображение показывает su, написанное дважды на монгольском языке, используя две разные формы для буквы u (красным). (Монгольский язык написан вертикально, причем буквы связаны как курсивные буквы на английском языке.)
В Юникоде эти две строки будут выражены как
var suForm1: String = "\u{1830}\u{1826}"
var suForm2: String = "\u{1830}\u{1826}\u{180B}"
Селектор Free Variation (U + 180B) в suForm2
распознается (правильно) Swift String
как единица с предшествующим им u (U + 1826). Swift считается одним персонажем, расширенным кластером графем. Однако для выполнения самого рендеринга мне нужно различать u (U + 1826) и FVS1 (U + 180B) как две различные кодовые точки UTF-16.
Для внутренних целей отображения я бы преобразовал приведенные выше строки Unicode в следующие отображаемые глиф-строки:
suForm1 = "\u{E46F}\u{E3BA}"
suForm2 = "\u{E46F}\u{E3BB}"
Вопрос
Я играл с Swift String
и Character
. В них есть много удобных вещей, но поскольку в моем конкретном случае я занимаюсь исключительно блоками кода UTF-16, мне интересно, должен ли я использовать старый NSString
, а не Swift String
. Я понимаю, что я могу использовать String.utf16
для получения кодовых точек UTF-16, но преобразование обратно в String
не очень приятно.
Было бы лучше придерживаться String
и Character
или мне следует использовать NSString
и unichar
?
Что я прочитал
Обновления этого вопроса были скрыты, чтобы очистить страницу. См. Историю изменений.