Работа с кодовыми точками Юникода в Swift

Если вы не интересуетесь подробностями монгольского языка, а просто хотите получить быстрый ответ об использовании и преобразовании значений Unicode в Swift, перейдите к первой частипринятый ответ.

Фон

Я хочу сделать текст Unicode длятрадиционный монгольский для использования в приложениях iOS, Лучшим и долгосрочным решением является использованиеУмный шрифт AAT это сделало бы этот сложный сценарий. (Такие шрифты существуют но их лицензия не допускает изменения и не личного использования.) Однако, поскольку я никогда не создавал шрифт, не говоря уже о всей логике рендеринга для шрифта AAT, я просто планирую сейчас делать рендеринг в Swift. Возможно, позже я смогу научиться делать умный шрифт.

Внешне я буду использовать текст Unicode, но внутренне (для отображения вUITextView) Я преобразую Unicode в отдельные глифы, которые хранятся в немом шрифте (закодирован с UnicodeНСД ценности). Поэтому мой механизм рендеринга должен преобразовать значения монгольского Unicode (диапазон: от U + 1820 до U + 1842) в значения глифов, хранящиеся в PUA (диапазон: от U + E360 до U + E5CF). Во всяком случае, это мой план, так какчто я делал на Java в прошлом, но, возможно, мне нужно изменить весь мой образ мыслей.

пример

На следующем рисунке показаносу написано дважды на монгольском языке, используя две разные формы для письмаu (в красном). (Монгольский написан вертикально с буквами, связанными как курсивные буквы на английском языке.)

В Unicode эти две строки будут выражаться как

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

Селектор вариаций (U + 180B) вsuForm2 признан (правильно) SwiftString быть единым целым сu (U + 1826), который предшествует этому. Свифт считает его одним символом, расширенным кластером графем. Тем не менее, для целей рендеринга, мне нужно дифференцироватьu (U + 1826) и FVS1 (U + 180B) как две разные кодовые точки UTF-16.

Для внутреннего отображения я бы преобразовал приведенные выше строки Юникода в следующие отрисованные строки глифа:

suForm1 = "\u{E46F}\u{E3BA}" 
suForm2 = "\u{E46F}\u{E3BB}"
Вопрос

Я играл со СвифтомString а такжеCharacter, В них есть много удобных вещей, но так как в моем конкретном случае я имею дело исключительно с блоками кода UTF-16, мне интересно, стоит ли мне использовать старыйNSString а не СвифтаString, Я понимаю, что могу использоватьString.utf16 чтобы получить кодовые точки UTF-16, нопреобразование обратно вString не очень приятно.

Будет ли лучше придерживатьсяString а такжеCharacter или я должен использоватьNSString а такжеunichar?

Что я прочиталДокументация по строкам и символамСтруны в SwiftNSString и Unicode

Обновления к этому вопросу были скрыты, чтобы очистить страницу. Смотрите историю редактирования.

Ответы на вопрос(1)

Ваш ответ на вопрос