Официальный форум СВД Встраиваемые Системы
23 Апрель, 2024, 21:41:01 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: ncurses и текст на русском  (Прочитано 4491 раз)
michael79
Пользователь

Сообщений: 12


« : 06 Июнь, 2014, 07:24:07 »

Добрый день!

Я прочитал закрытую тему про QNX 6.5 и ncurses-5.9 (http://ftp://ftp.gnu.org/pub/gnu/ncurses/), в которой обсуждалось, как сделать так, чтобы русский текст выводился через ncurses.
В моём случае проблема в деталях такая: использую функции printw() и mvprintv(). Т.к. mvprintw() периодически глючит с положением текста на экране, использую комбинацию move(x,y) и printw(). При попытке вывести строку символов ( char* или char[] ) выводится только первая русская буква(удивительно, что она всё ж выводится), после чего больше никакие не выводятся, в том числе и латинница.

Там говорилось, что где-то в паре мест нужно убрать проверку isprint. Сможет кто-нибудь уточнить, где от этой проверки нужно отказаться? Дело в том, что этих проверок там, судя по " grep isprint * " , оказалось достаточно много.

Пробовал различные варианты ./configure ......
В том числе
./configure --enable-bsdpad --enable-overwrite --with-cxx-binding --without-ada --without-gpm --with-manpage-format=normal --with-manpage-tbl
Добился, чтобы он проходил до конца.

Запустил make install.data
Не с первого раза, но это действие всё-таки прошло.

То ли ./configure, то ли make install.data сначала не проходил до конца, ссылаясь на то, что не может создать папку в директории /tmp.
Оказалось, что в моём случае, /tmp была не совсем папка, это была симв. ссылка (-> /dev/shmem ). После того, как я вручную создал папку /tmp, всё сработало.

Однако на этапе сборки (make) появляется ошибка:
./demo_terminfo.c:271: undefined reference to 'use_external_names'

Закомментировал это место в коде, затем такая же ошибка появилась для другой переменной, и я перестал пытаться что-то исправлять.

Помогите разобраться, как правильно исправить код (убрать ненужные isprint проверки) и как правильно собрать ncurses.

Насколько я понял из описаний, последовательность действий такая:

# ./configure <параметры>
# make install.data
# make

В некоторых статьях написано, что подобная проблема решается использованием ncursesw. В QNX6.5.0 есть только ncurses. Есть ли смысл пытаться собирать ncursesw и как это сделать при необходимости?

И ещё один вопрос. Что нужно делать, когда сборка всё-таки завершится удачно? Какие файлы и куда необходимо поместить?
Записан
Игорь Рондарев
Модератор
Опытный пользователь

Сообщений: 282

Сотрудник СВД ВС


WWW
« Ответ #1 : 09 Июнь, 2014, 15:58:39 »

Добрый день! Действительно, особенности работы библиотеки ncurses под QNX обусловлены в частности использованием функции isprint(). Мы проанализируем код библиотеки на предмет возможности его модификации для корректной поддержки вывода русских букв. Будет весьма кстати, если Вы сможете предоставить фрагмент кода вашего приложения, который в настоящий момент работает некорректно.
Записан

michael79
Пользователь

Сообщений: 12


« Ответ #2 : 10 Июнь, 2014, 10:20:06 »

Спасибо за ответ,
приведу маленький кусочек кода:

...
#include <ncurses.h>
....

initscr();
move(0,0);
printw("Pressed button");
move(1,0);
printw("Нажата кнопка");


в Makefile добавлено -lncurses как полагается

при запуске на исполнение выдает следующее:
Pressed button
Н


печатается только первый символ русской строки.
система QNX6.5.0 с русификатором cyrillic pack 6.5.0
printf("Нажата кнопка\n"); // работает корректно
Записан
Игорь Рондарев
Модератор
Опытный пользователь

Сообщений: 282

Сотрудник СВД ВС


WWW
« Ответ #3 : 16 Июнь, 2014, 12:16:58 »

Добрый день! Попробуйте скомпилировать и выполнить данное приложение, чтобы проверить, корректно ли отображаются буквы на вашей сборке ncurses при установке локали в C-TRADITIONAL:

Код:
#include <stdlib.h>
#include <stdio.h>
#include <ncurses.h>
#include <locale.h>

int main(int argc, char *argv[]) {
setlocale(LC_ALL, "C-TRADITIONAL");
initscr();
move(0,0);
printw("Pressed button");
move(1,0);
printw("Нажата кнопка");
move(2,0);
refresh();
return EXIT_SUCCESS;
}
« Последнее редактирование: 16 Июнь, 2014, 12:25:33 от Игорь Рондарев » Записан

michael79
Пользователь

Сообщений: 12


« Ответ #4 : 16 Июнь, 2014, 14:42:21 »

Спасибо. Попробовал, помогло.

Остался незначительный баг: если выполнить printw() подряд 2 раза с выводом одинаковых данных, то возникают ошибки при выводе. Например:

move(10,0);
printw("Byte %X", byte_1);
move(11,10);
printw("Byte %X", byte_1);
move(12,10);
printw("Byte %X", byte_1);
refresh();

при выполнении подобного кода на экране появится следующее:

Byte FF
F      Byte FF
F      Byte FF

я заметил, что если переменная byte_1 меняется (например на EF), то в строках повторного вывода будет не
"F      Byte FF" , а "E      Byte EF". Если она станет равной F5, то выведутся строки "5      Byte F5".

Моей программе данная проблема не вредит, т.к. я не использую повторный вывод одной и той же переменной и обнаружил это случайно. Тему можно закрыть, благодарю за поддержку.
Записан
Игорь Рондарев
Модератор
Опытный пользователь

Сообщений: 282

Сотрудник СВД ВС


WWW
« Ответ #5 : 16 Июнь, 2014, 15:28:54 »

Вообще сам вывод уже наводит на мысли, что что-то не так (имеется в виду повторный вывод символа "F" в начале следующей строки, этого быть не должно).
Цитировать
Byte FF
F      Byte FF
F      Byte FF
Проверил на своей системе, вывод выглядит следующим образом (значение переменной byte_1 менял, оно в данном случае роли не играет):
Цитировать
Byte FF
          Byte FF
          Byte FF
Если появятся какие-то новости относительно сборки и поддержки русского языка - будем добавлять их на форум.
Записан

michael79
Пользователь

Сообщений: 12


« Ответ #6 : 19 Июнь, 2014, 07:24:05 »

Выяснил детали с некорректным лишним выводом "F".
Данная проблема проявляется только в псевдотерминале фотона, но если фотон не загружать, то в консоли вывод строк абсолютно корректен.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP © 2002-2024 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на forum.kpda.ru обязательна.

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines | © Aiwan. Kolobok smiles | Sitemap
Valid XHTML 1.0! Valid CSS!
Сайт СВД ВС

В последний раз google посещал эту страницу 28 Март, 2024, 19:34:53