Summary: | В wineconsole не вводятся русские символы (кириллица) | ||
---|---|---|---|
Product: | WINE@Etersoft | Reporter: | Константин Петров <argentum> |
Component: | Общее | Assignee: | Анатолий Лютин <vostok> |
Status: | CLOSED FIXED | QA Contact: | Vitaly Lipatov <lav> |
Severity: | normal | ||
Priority: | P2 | CC: | kondratyuk, vostok |
Version: | 1.0.4 | ||
Target Milestone: | --- | ||
Hardware: | PC | ||
OS: | Linux | ||
Whiteboard: | |||
Заявки RT: | Связано с: | ||
Дата напоминания: | |||
Bug Depends on: | |||
Bug Blocks: | 57, 190, 389, 600 | ||
Attachments: |
неполный патч
Программа, проявляющая проблему |
Description
Константин Петров
2006-10-09 12:25:19 MSD
рассмотрел источник возникновения баги. он находится в programs/wineconsole/curses.c Со стандартного ввода символ считывается в функции WCCURSES_GetEvents c помощью wgetch(stdstr), далее заполняется структура ir[numEvent].Event.KeyEvent в функции WCCURSES_FillSimpleChar. При этом в качестве Unicode-строки записывается однобайтовое значение: ir[numEvent].Event.KeyEvent.uChar.UnicodeChar = (unsigned char)inchar; С английскими символами проблем нет, поскольку они одинаково кодируются как в ASCII, так и в Unicode. Сделал патч, добавил перекодировку в Unicode перед обработкой. Теперь вводимый символ читается правильно, но на экран выводятся пустые поля. Пока не смог найти , кто и каки образом осуществляет вывод. шзначально выводом на консоль текста занимается функция WriteConsoleOutputW в dlls/kernel/console.c Created attachment 65 [details]
неполный патч
этот патч преобразует считываемый символ в Unicode-формат. Таким образом,
символ правильно обрабатывается в дальнейшем. Т.е. в структуре ir правильно
заполняется поле UnicodeChar.
Но пока что не решена проблема правильной обработки VirtualKeyCode, поскольку
сейчас определение VirtualKeyCode, насколько я понимаю, происходит с учетом,
что считанный символ находится в кодировке ASCII.
Также все остальные переменные структуры ir, кроме UnicodeChar, определются
неверно (думаю требуется перекодировка в Ascii перед записбю в переменные).
ш самое главное криво работает вывод символа на экран консоли. После патча
латиница выводится, а кириллица выводится пробелами (раньше выводилась 1
латинским символом).
Created attachment 74 [details]
Пример проблемы
Теперь при попадании в функции FillSimpleChar в curses.c считываются дополнительно 3 символа и конвертируются в переменную типа wchar с кодировкой текущей локали.
ш ir[numEvent].Event.KeyEvent.uChar.UnicodeChar заполняется данной переменной типа WCHAR.
Created attachment 75 [details]
Окно с проблемой
!Работает только после установки патча wineconsole_curses_out!
Вывод на экран осуществляется теперь функцией mvwaddnwstr в функции Refresh.
Работает как в 8-битной консоли,так и в Юникодной.
Created attachment 76 [details]
Лог ошибки
!Работает только после установки патча wineconsole_curses_out!
Вывод на экран осуществляется теперь функцией mvwaddnwstr в функции Refresh.
Работает как в 8-битной консоли,так и в Юникодной.
Насколько я понял, действительно правильный способ поддержки юникода - это использование libncursesw. Вот некоторые замечания по недавно вышедшей версии ncurses 5.6 http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=341661 http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=316663 Created attachment 120 [details]
Программа, проявляющая проблему
Так как программы из состава RS-Bank так и не воспринимают русский ввод, снова открываю багу. Всё воспринимает, что и было доказано Константину,как у меня так и на сервере. Ждём ответа от клиента! Закрываю, т.к. несостоятельна. Открываю новую багу и ставлю depend on |