URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6483
[ Назад ]

Исходное сообщение
"ncurses: вывеси символ в utf-8 локали"

Отправлено AMDmi3 , 21-Май-07 17:35 
Как сделать сабж?

Банальный addch с utf8 кодом символа не работает. Имеется в виду libncurses, не libncursesw. Всякие irssi, vim как-то это умеют...


Содержание

Сообщения в этом обсуждении
"ncurses: вывеси символ в utf-8 локали"
Отправлено NuINu , 21-Май-07 17:38 
>Как сделать сабж?
>
>Банальный addch с utf8 кодом символа не работает. Имеется в виду libncurses,
>не libncursesw. Всякие irssi, vim как-то это умеют...

а как ты делаешь? опиши. а лучше код.


"ncurses: вывеси символ в utf-8 локали"
Отправлено AMDmi3 , 21-Май-07 18:02 
>а как ты делаешь? опиши. а лучше код.

#include <curses.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
        initscr();

        addch(0xe1);
        addch(':');
        addch(0x90d0);
        refresh();

        sleep(5);

        endwin();

        return 0;
}

В koi8-r локале выдает А:п
Логично, первый символ - koi8-r 'А', второй юникод который мы не понимаем

В utf-8 выдает ?:
? - неизвесный терминалу символ, что логично; юникодную 'А' не пишет


"ncurses: вывеси символ в utf-8 локали"
Отправлено perece , 22-Май-07 10:23 
>>а как ты делаешь? опиши. а лучше код.
>
>#include <curses.h>
>#include <stdlib.h>
>#include <unistd.h>
>
>int main() {
>        initscr();
>
>        addch(0xe1);
>        addch(':');
>        addch(0x90d0);
>        refresh();
>
>        sleep(5);
>
>        endwin();
>
>        return 0;
>}
>
>В koi8-r локале выдает А:п
>Логично, первый символ - koi8-r 'А', второй юникод который мы не понимаем
>
>
>В utf-8 выдает ?:
>? - неизвесный терминалу символ, что логично; юникодную 'А' не пишет
позволю себе предположить, что вместо addch(0x90d0); нужно addch(0x90);addch(0xd0);
это только догадка, я в курсесах не секу вообще. но с тем, как работает терминал знаком, и потому рискнул предположить

\^P^/


"ncurses: вывеси символ в utf-8 локали"
Отправлено AMDmi3 , 22-Май-07 13:19 
>позволю себе предположить, что вместо addch(0x90d0); нужно addch(0x90);addch(0xd0);
>это только догадка, я в курсесах не секу вообще. но с тем,
>как работает терминал знаком, и потому рискнул предположить

Не работает. Я вычитал про escape последовательность \033%G которая якобы включает UTF-8 режим. gnome-terminal действительно переключается в UTF-8, если выбрать другую кодировку (Terminal->Set Character Encoding), но 'А' так и не печатает.


"ncurses: вывеси символ в utf-8 локали"
Отправлено NuINu , 22-Май-07 13:57 
>>позволю себе предположить, что вместо addch(0x90d0); нужно addch(0x90);addch(0xd0);
>>это только догадка, я в курсесах не секу вообще. но с тем,
>>как работает терминал знаком, и потому рискнул предположить
>
>Не работает. Я вычитал про escape последовательность \033%G которая якобы включает UTF-8 режим. gnome-terminal действительно переключается в UTF-8, если выбрать другую кодировку (Terminal->Set Character Encoding), но 'А' так и не печатает.


В принципе что то вывести можно, но думаю не через addch, там тип вообще не чар, а какой то другой, в доке написано что там храниться по мимо кода символа информация о цвете
во первых ncurses должен быть собран с поддержкой utf-8, а у меня он собран то ли без нее, толи очень уж старая версия курсес, вообщем половину символов выводит не правильно, я особо не парюсь, лучше делать все в кои8.
во вторых желательно нкурсес новый иметь.
ну а так вот пример, если выводить просто без нкурсес то так:
        oldlocale =  setlocale(LC_ALL, "ru_RU.UTF-8");
        char o2[] = {0xD0, 0x9F, 0xD1, 0x80, 0xD0, 0xB8, 0xD0, 0xB2, 0xD0, 0xB5, 0xD1, 0x82, 0};
        printf("%s\n", o2);
все выодит правильно.
а в курсес:
       mvprintw(1,30, o2);
выводимая строчка: Привет
под нкурсес печатает    "иве" все остальное нифига не печатает(вернее печатает лабуду).
видно он часть того что я вывожу как то интерпретирует, и выполняет какие то замены.

как надо правильно, не знаю, надо исходники смотреть.


"ncurses: вывеси символ в utf-8 локали"
Отправлено AMDmi3 , 22-Май-07 15:19 
>В принципе что то вывести можно, но думаю не через addch, там
>тип вообще не чар, а какой то другой, в доке написано
>что там храниться по мимо кода символа информация о цвете
>во первых ncurses должен быть собран с поддержкой utf-8, а у меня
>он собран то ли без нее, толи очень уж старая версия
>курсес, вообщем половину символов выводит не правильно, я особо не парюсь,
>лучше делать все в кои8.
>во вторых желательно нкурсес новый иметь.
>ну а так вот пример, если выводить просто без нкурсес то так:
>
>        oldlocale =  setlocale(LC_ALL, "ru_RU.UTF-8");
>        char o2[] = {0xD0, 0x9F, 0xD1, 0x80, 0xD0, 0xB8, 0xD0, 0xB2, 0xD0, 0xB5, 0xD1, 0x82, 0};
>        printf("%s\n", o2);
>все выодит правильно.
>а в курсес:
>       mvprintw(1,30, o2);
>выводимая строчка: Привет
>под нкурсес печатает    "иве" все остальное нифига не печатает(вернее
>печатает лабуду).
>видно он часть того что я вывожу как то интерпретирует, и выполняет
>какие то замены.
>
>как надо правильно, не знаю, надо исходники смотреть.

У меня выводит <мусор>иве<мусор>

Вобщем-то мне всего лишь нужно написать приложение, которое будет работать в любой локали. Надо смотреть на python и urwid...


"ncurses: вывеси символ в utf-8 локали"
Отправлено NuINu , 22-Май-07 15:56 
>>В принципе что то вывести можно, но думаю не через addch, там
>>тип вообще не чар, а какой то другой, в доке написано
>>что там храниться по мимо кода символа информация о цвете
>>во первых ncurses должен быть собран с поддержкой utf-8, а у меня
>>он собран то ли без нее, толи очень уж старая версия
>>курсес, вообщем половину символов выводит не правильно, я особо не парюсь,
>>лучше делать все в кои8.
>>во вторых желательно нкурсес новый иметь.
>>ну а так вот пример, если выводить просто без нкурсес то так:
>>
>>        oldlocale =  setlocale(LC_ALL, "ru_RU.UTF-8");
>>        char o2[] = {0xD0, 0x9F, 0xD1, 0x80, 0xD0, 0xB8, 0xD0, 0xB2, 0xD0, 0xB5, 0xD1, 0x82, 0};
>>        printf("%s\n", o2);
>>все выодит правильно.
>>а в курсес:
>>       mvprintw(1,30, o2);
>>выводимая строчка: Привет
>>под нкурсес печатает    "иве" все остальное нифига не печатает(вернее
>>печатает лабуду).
>>видно он часть того что я вывожу как то интерпретирует, и выполняет
>>какие то замены.
>>
>>как надо правильно, не знаю, надо исходники смотреть.
>
>У меня выводит <мусор>иве<мусор>
>
>Вобщем-то мне всего лишь нужно написать приложение, которое будет работать в любой
>локали. Надо смотреть на python и urwid...
да они на том же все работают, смотри на новый нкурсес, проверь собран ли он с поддержкой utf. у меня и mc на utf кривовато работает. хотя надо заметить что буковки Пр таки иногда выводит.


"ncurses: вывеси символ в utf-8 локали"
Отправлено AMDmi3 , 22-Май-07 16:21 
>да они на том же все работают, смотри на новый нкурсес, проверь
>собран ли он с поддержкой utf. у меня и mc на
>utf кривовато работает. хотя надо заметить что буковки Пр таки иногда
>выводит.
Вообще, да. Мне просто казалось что он недостаточно распространен, но вон во FreeBSD 6.2-stable он уже включен, видимо все не так плохо. Мне просто интересно как же работают приложения, использующие сейчас обычный ncurses и как вообще мы жили до сих пор.

"ncurses: вывеси символ в utf-8 локали"
Отправлено NuINu , 23-Май-07 09:49 
>>да они на том же все работают, смотри на новый нкурсес, проверь
>>собран ли он с поддержкой utf. у меня и mc на
>>utf кривовато работает. хотя надо заметить что буковки Пр таки иногда
>>выводит.
>Вообще, да. Мне просто казалось что он недостаточно распространен, но вон во
>FreeBSD 6.2-stable он уже включен, видимо все не так плохо. Мне
>просто интересно как же работают приложения, использующие сейчас обычный ncurses и
>как вообще мы жили до сих пор.

Делов то!!! возьми и посмотри исходники. У меня просто здесь нет дистрибутива, а так бы посмотрел.


"ncurses: вывеси символ в utf-8 локали"
Отправлено AMDmi3 , 23-Май-07 13:08 
>Делов то!!! возьми и посмотри исходники. У меня просто здесь нет дистрибутива,
>а так бы посмотрел.
Если бы там было все так прозрачно, я бы не спрашивал :)

"ncurses: вывеси символ в utf-8 локали"
Отправлено NuINu , 23-Май-07 14:55 
>>Делов то!!! возьми и посмотри исходники. У меня просто здесь нет дистрибутива,
>>а так бы посмотрел.
>Если бы там было все так прозрачно, я бы не спрашивал :)
>
У меня по прежнему нет ncurses :), за то я посморел свой mc который ни шатко ни валко, а таки работает с utf8, так вот он собран с поддержкой slang, и работает не через ncurses.

кстати выдержка из myslang.h
#ifdef UTF8
/*
* Patched S-Lang in Red Hat 8.0 expects wchar_t as the argument to addch()
* Avoid conversion by using SLsmg_write_nchars(), which takes char*
*/
#undef addch
static inline void
mc_addch (char c)
{
    SLsmg_write_nchars (&c, 1);
}
#define addch(c) mc_addch(c)
#else
#define addch(c) SLsmg_write_char(c)
#endif

но я собирал без поддержки UTF8



"ncurses: вывеси символ в utf-8 локали"
Отправлено dimonna , 25-Май-07 09:23 
Аналогичная проблема:
В mc русские таким же образом (не все буквы) побиты, хотя к примеру в vi, да и в самой консоли русские обрабатываются корректно. Мучаюсь так уже полтора года как сменил koi8 на utf-8.

printf("Русский текст\n"); //////// Работает корректно

С ncurses:
printw("Русский текст"); ///// Часть букв - часть квадратиков

ncurses собрал последжнюю версию с поддержкой wide chars (как я понимаю это и есть поддержка utf-8), и mc собрал с поддержкой ncurses. Следовательно проблема не в mc, а в ncurses.

Что курочать надо чтобы побороть проблему?


"ncurses: вывеси символ в utf-8 локали"
Отправлено NuINu , 25-Май-07 10:26 

>ncurses собрал последжнюю версию с поддержкой wide chars (как я понимаю это
>и есть поддержка utf-8), и mc собрал с поддержкой ncurses. Следовательно
>проблема не в mc, а в ncurses.
>
>Что курочать надо чтобы побороть проблему?
Так и не понял чего тебя в данном случае мучает? тебе хочеться ncurses проверить или
mc разобрать?
может быть лучше мс с mcslang собрать?



"ncurses: вывеси символ в utf-8 локали"
Отправлено dimonna , 25-Май-07 10:42 
>
>>ncurses собрал последжнюю версию с поддержкой wide chars (как я понимаю это
>>и есть поддержка utf-8), и mc собрал с поддержкой ncurses. Следовательно
>>проблема не в mc, а в ncurses.
>>
>>Что курочать надо чтобы побороть проблему?
>Так и не понял чего тебя в данном случае мучает? тебе хочеться
>ncurses проверить или
>mc разобрать?
>может быть лучше мс с mcslang собрать?


я хочу чтобы ncurses корректно работал с utf-8. Что для этого надо сделать?


"ncurses: вывеси символ в utf-8 локали"
Отправлено NuINu , 25-Май-07 11:29 
>>
>>>ncurses собрал последжнюю версию с поддержкой wide chars (как я понимаю это
>>>и есть поддержка utf-8), и mc собрал с поддержкой ncurses. Следовательно
>>>проблема не в mc, а в ncurses.
>>>
>>>Что курочать надо чтобы побороть проблему?
>>Так и не понял чего тебя в данном случае мучает? тебе хочеться
>>ncurses проверить или
>>mc разобрать?
>>может быть лучше мс с mcslang собрать?
>
>
>я хочу чтобы ncurses корректно работал с utf-8. Что для этого надо
>сделать?
можешь по инету полазить, а так придется самому разбираться. извини, у меня кои8.
тут я тебе помочь не могу. ты со своей последней библиотекой, тесты то прогнал?
ну вот тот что я с "привет" приводил. не работает?
значит смотреть исходники надо.


"ncurses: вывеси символ в utf-8 локали"
Отправлено perece , 30-Май-07 16:00 
>ncurses собрал последжнюю версию с поддержкой wide chars (как я понимаю это
>и есть поддержка utf-8),
неправильно понимаете. wide char - это UCS2. а UTF8 использует обычные char, только в некоторых случаях по несколько на символ
поддержка UTF-8 там должна отдельно включаться, видимо

\^P^/


"ncurses: вывеси символ в utf-8 локали"
Отправлено dimonna , 03-Июн-07 11:42 
>>ncurses собрал последжнюю версию с поддержкой wide chars (как я понимаю это
>>и есть поддержка utf-8),
>неправильно понимаете. wide char - это UCS2. а UTF8 использует обычные char,
>только в некоторых случаях по несколько на символ
>поддержка UTF-8 там должна отдельно включаться, видимо
>
>\^P^/


КАКИМ ОБРАЗОМ??


"ncurses: вывеси символ в utf-8 локали"
Отправлено perece , 04-Июн-07 12:06 
>>поддержка UTF-8 там должна отдельно включаться, видимо
>КАКИМ ОБРАЗОМ??
яхз. еслиб знал - не писал бы в неопределенной форме

\^P^/


"ncurses: вывеси символ в utf-8 локали"
Отправлено Cirill , 01-Июл-08 23:53 
Я пытался решить похожую проблему.
Решение нашёл здесь:
http://namakajiri.net/complog/trouble-using-utf-8-with-ncurses/

кратко:
Добавить #include <locale.h> в заголовок и setlocale(LC_CTYPE, ""); до initscr(); после чего наступит счастье.


"ncurses: вывеси символ в utf-8 локали"
Отправлено pup , 03-Июл-08 23:37 
Я тоже столкнулся с этой проблемой.

>Добавить #include <locale.h> в заголовок и setlocale(LC_CTYPE, ""); до initscr(); после чего наступит счастье.

Это помогает справиться с выводом utf-8 строк, то есть начинают работать функции типа addstr и printw. Но addch продолжает выводить гадости. То есть, если выводить символ через addch побайтно, ncurses рисует пробел и потом utf8 символ, причём с инвертированным атрибутом. (пробел -- это он выглядит как пробел в urxvt, что ncurses на самом деле выводит -- я не знаю).
Собственно как это побеждать -- не знаю, думаю обойти на кривой и написать что-нибудь вида:

void myaddch (char c)
{
    static char buf[5] = "";
    static int len = 0;
    
    buf[len++] = c;
    buf[len] = '\0';
    if (len >= 4) {
        len = 0;
    } else if (is_valid_utf8_char (buf)) {
        addstr (buf);
        len = 0;
    }
}