Re[9]: Unicode и итерация по символам
От: Sinclair Россия https://github.com/evilguest/
Дата: 29.01.23 14:46
Оценка:
Здравствуйте, пффф, Вы писали:

П>Произвольный именно текст, эмоджи идут в жопу, LTR/RTL нужно, вперемешку — скорее да

Ну, тогда, наверное, при выводе надо полагаться на GDI-шные функции, которые позволяют рассчитать положение всех символов; а при редактировании можно делить по базовым/модификаторам.
То есть если у нас курсор стоит вот так: ё|жик и мы нажимаем backspace, то удалять надо всю букву, независимо от того, представлена ли она в предкомбинированном виде, либо в виде "е c умляутом".
Точно так же делаем, если у нас курсор стоит вот так жуль|ё и мы нажимаем del.
Аналогично — выделение, копирование, вырезание и вставка: копируются базовые символы со всеми их модификаторами.
Раз emoji не важны, на ZWJ можно забить. Если нет — то можно его тоже использовать как критерий объединения: x<zwj>y<zwj>z должно выделяться/копироваться/удаляться как единый символ.
С RTL я подробностей не помню. AFAIR, там основное — понять, какое направление у нас главное.
Если мы имеем LTR-текст с редкими вкраплениями RTL фрагментов, то навигация по тексту устроена так, что кнопка -> сдвигает курсор "дальше" от начала строки (в терминах последовательности unicode codepoint). При натыкании на RTL-фрагмент, курсор "прыгает" через фрагмент, и кнопка -> начинает его двигать справа налево (т.к. по-прежнему двигает курсор "дальше" от начала строки в терминах последовательности unicode codepoint).
А если у нас основное направление RTL, то логичнее инвертировать поведение кнопок <- и ->. Ну, потому, что иначе редактирование чисто-RTLного текста выглядит контр-интуитивно.

См. тж. https://habr.com/ru/post/104493/
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Unicode и итерация по символам
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 29.01.23 15:35
Оценка:
Здравствуйте, пффф, Вы писали:

П>Привет!


П>Хз в какой форум с такой темой, если что — перенесите куда правильно.


П>Вопрос — как правильно итерироваться по юникодному тексту? По символам я умею, как в UTF-8 (линупсы), так и по виндовому WCHAR* — UTF-16 вроде же?


П>Но ведь это ничего не значит, потому что один глиф (или как правильно сказать?) может состоять из нескольких codepoints, так?

То что ты хочешь называется графемамиhttps://unicode.org/reports/tr29/


П>В винде, допустим, должны быть какие-то функции на эту тему (кстати, какие?).

Я посмотрел реализацию итератора по графемами в .NET — нет, там все самописное.

П>А как быть в линупсе? Я немного почитал про composition/decomposition, там про какие-то таблицы декомпозиции пишут. Самому с этим возиться неохота. Есть какое-то стандартное API, которое всегда есть или может быть легко установлено?

Нет такого стандартного АПИ, видимо потому что оно никому не нужно.
По факту в шрифтах лигатуры назначаются просто на набор (любое количество) кодпоинтов и не факт что это будет соотноситься со сецификацией юникода.


П>Кстати, некоторые раскладки в винде могут генерить целые пачки символов — лигатуры, например в персидском аж до 4х WCHAR может быть за одно нажатие.

Это и есть графемы.

П>А отображается — как один символ.

Это уже лигатуры.

П>Тут явно больше одного UTF-32 codepoints.

Скорее всего 4


П>Если они могут быть подвергнуты композиции — то почему это не сделано?

Это сделано шлрифтом.

П>А если не могут, то как по ним корректно итерироваться?

Искать готовую библиотеку на твоем языке по работе с графемами или постигать работу со шрифтами.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.