-
Notifications
You must be signed in to change notification settings - Fork 173
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Unicode issues left — metabug #2157
Comments
The issue of Unicode support in console applications has proven to be quite serious and goes beyond the scope of the far2l project. Specifically, the problem is that in different terminals, the width of the same string of characters can vary. I have gathered some materials on this topic.
|
Перевёл на русский предложенный стандарт поддержки Юникода в текстовых терминалах с unicode.org. https://github.com/unxed/UnicodeTerminals |
Silver bullet? |
Or not.
|
Вот тут имеется предложение по тому, как решать проблему с неоднозначностями в ширине символов Юникода, которое имеет как минимум одну реализацию, и которое в первом приближении одобрили в багтрекере Windows Terminal: https://github.com/directvt/vtm/blob/master/doc/character_geometry.md Суть, кратко: предлагается использовать модификаторы Unicode (кодовые точки 0xD0000-0xD02A2) для управления отображением символов в терминале. Каждый символ рассматривается как матрица ячеек обычной (т.е. half-width в текущих терминах) ширины (например, 3x1, 2x2). Модификатор указывает размер матрицы и какой ее фрагмент отображать в ячейке терминала. Фрагменты матрицы размером до 8x4 ячеек требуют как минимум четыре связанных целочисленных значения, которые могут быть упакованы в пространство кодовых точек Unicode путем перечисления значений "wh_xy": w: Ширина матрицы символов. Например, этот код выведет символ размером 3x1:
Для матриц символов размером более 8x4 предлагается использовать пиксельную графику. |
На самом деле, это пока не реализовано полностью. В частности, терминал vtm поддерживает вывод только фрагментами, т.е. нельзя вывести сразу кластер размером 3х3, т.е. выше одной строки, пока что возможно выводить фрагменты только одинарной высоты - т.е. для случая 3х3 придется выводить три фрагмента размером 3x1. Но это чисто техническая недоделка, мне нужно просто сесть и это дописать. Хотелось сначала посмотреть, как это пойдет и поиграться с этим, и если ок, то доделать до конца. По большому счету этот подход за неколько лет ни с чем особо не законфликтовал. Года четыре я его гонял в режиме 1х1 - 2х1, и с недавнего времени я его расширил до 8х4. И да, этот подход позволяет выводить в терминале глифы сложных письменностей, таких как деванагари, для которых невозможно создать приемлемый моноширный шрифт. |
Изящно! Спасибо за идею, ребята из команды Windows Terminal правы, она выглядит самой разумной на сегодняшний день. Жалко мне в Wine не попробовать, не стартует. |
Видимо это следствие того, что там у меня не совсем стандартно эксплуатируется Win32 GDI API или там просто баг (что вероятнее). В скором времени будет реализация для X11, и можно будет нативно на любом юниксе погонять. |
Обсуждение решения проблемы синхронизации представлений о ширине символа терминала и приложения идёт здесь: В iTerm2 сделали ESC последовательность для указания точной версии Юникода, которую должен использовать терминал. Я предлагал такое в качестве одного из решений. И там ещё один вариант предложен, тоже жизнеспособный, как по мне: |
#1380
#1199 (comment)
#1941
#2045
#2136
#2138
#2141
#2378
The text was updated successfully, but these errors were encountered: