Работа с кодовыми точками Юникода в 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
?
Обновления к этому вопросу были скрыты, чтобы очистить страницу. Смотрите историю редактирования.