Как сделать сабж?Банальный addch с utf8 кодом символа не работает. Имеется в виду libncurses, не libncursesw. Всякие irssi, vim как-то это умеют...
>Как сделать сабж?
>
>Банальный addch с utf8 кодом символа не работает. Имеется в виду libncurses,
>не libncursesw. Всякие irssi, vim как-то это умеют...а как ты делаешь? опиши. а лучше код.
>а как ты делаешь? опиши. а лучше код.#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 выдает ?:
? - неизвесный терминалу символ, что логично; юникодную 'А' не пишет
>>а как ты делаешь? опиши. а лучше код.
>
>#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^/
>позволю себе предположить, что вместо addch(0x90d0); нужно addch(0x90);addch(0xd0);
>это только догадка, я в курсесах не секу вообще. но с тем,
>как работает терминал знаком, и потому рискнул предположитьНе работает. Я вычитал про escape последовательность \033%G которая якобы включает UTF-8 режим. gnome-terminal действительно переключается в UTF-8, если выбрать другую кодировку (Terminal->Set Character Encoding), но 'А' так и не печатает.
>>позволю себе предположить, что вместо 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);
выводимая строчка: Привет
под нкурсес печатает "иве" все остальное нифига не печатает(вернее печатает лабуду).
видно он часть того что я вывожу как то интерпретирует, и выполняет какие то замены.как надо правильно, не знаю, надо исходники смотреть.
>В принципе что то вывести можно, но думаю не через 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...
>>В принципе что то вывести можно, но думаю не через 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 кривовато работает. хотя надо заметить что буковки Пр таки иногда выводит.
>да они на том же все работают, смотри на новый нкурсес, проверь
>собран ли он с поддержкой utf. у меня и mc на
>utf кривовато работает. хотя надо заметить что буковки Пр таки иногда
>выводит.
Вообще, да. Мне просто казалось что он недостаточно распространен, но вон во FreeBSD 6.2-stable он уже включен, видимо все не так плохо. Мне просто интересно как же работают приложения, использующие сейчас обычный ncurses и как вообще мы жили до сих пор.
>>да они на том же все работают, смотри на новый нкурсес, проверь
>>собран ли он с поддержкой utf. у меня и mc на
>>utf кривовато работает. хотя надо заметить что буковки Пр таки иногда
>>выводит.
>Вообще, да. Мне просто казалось что он недостаточно распространен, но вон во
>FreeBSD 6.2-stable он уже включен, видимо все не так плохо. Мне
>просто интересно как же работают приложения, использующие сейчас обычный ncurses и
>как вообще мы жили до сих пор.Делов то!!! возьми и посмотри исходники. У меня просто здесь нет дистрибутива, а так бы посмотрел.
>Делов то!!! возьми и посмотри исходники. У меня просто здесь нет дистрибутива,
>а так бы посмотрел.
Если бы там было все так прозрачно, я бы не спрашивал :)
>>Делов то!!! возьми и посмотри исходники. У меня просто здесь нет дистрибутива,
>>а так бы посмотрел.
>Если бы там было все так прозрачно, я бы не спрашивал :)
>
У меня по прежнему нет 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
Аналогичная проблема:
В mc русские таким же образом (не все буквы) побиты, хотя к примеру в vi, да и в самой консоли русские обрабатываются корректно. Мучаюсь так уже полтора года как сменил koi8 на utf-8.printf("Русский текст\n"); //////// Работает корректно
С ncurses:
printw("Русский текст"); ///// Часть букв - часть квадратиковncurses собрал последжнюю версию с поддержкой wide chars (как я понимаю это и есть поддержка utf-8), и mc собрал с поддержкой ncurses. Следовательно проблема не в mc, а в ncurses.
Что курочать надо чтобы побороть проблему?
>ncurses собрал последжнюю версию с поддержкой wide chars (как я понимаю это
>и есть поддержка utf-8), и mc собрал с поддержкой ncurses. Следовательно
>проблема не в mc, а в ncurses.
>
>Что курочать надо чтобы побороть проблему?
Так и не понял чего тебя в данном случае мучает? тебе хочеться ncurses проверить или
mc разобрать?
может быть лучше мс с mcslang собрать?
>
>>ncurses собрал последжнюю версию с поддержкой wide chars (как я понимаю это
>>и есть поддержка utf-8), и mc собрал с поддержкой ncurses. Следовательно
>>проблема не в mc, а в ncurses.
>>
>>Что курочать надо чтобы побороть проблему?
>Так и не понял чего тебя в данном случае мучает? тебе хочеться
>ncurses проверить или
>mc разобрать?
>может быть лучше мс с mcslang собрать?
я хочу чтобы ncurses корректно работал с utf-8. Что для этого надо сделать?
>>
>>>ncurses собрал последжнюю версию с поддержкой wide chars (как я понимаю это
>>>и есть поддержка utf-8), и mc собрал с поддержкой ncurses. Следовательно
>>>проблема не в mc, а в ncurses.
>>>
>>>Что курочать надо чтобы побороть проблему?
>>Так и не понял чего тебя в данном случае мучает? тебе хочеться
>>ncurses проверить или
>>mc разобрать?
>>может быть лучше мс с mcslang собрать?
>
>
>я хочу чтобы ncurses корректно работал с utf-8. Что для этого надо
>сделать?
можешь по инету полазить, а так придется самому разбираться. извини, у меня кои8.
тут я тебе помочь не могу. ты со своей последней библиотекой, тесты то прогнал?
ну вот тот что я с "привет" приводил. не работает?
значит смотреть исходники надо.
>ncurses собрал последжнюю версию с поддержкой wide chars (как я понимаю это
>и есть поддержка utf-8),
неправильно понимаете. wide char - это UCS2. а UTF8 использует обычные char, только в некоторых случаях по несколько на символ
поддержка UTF-8 там должна отдельно включаться, видимо\^P^/
>>ncurses собрал последжнюю версию с поддержкой wide chars (как я понимаю это
>>и есть поддержка utf-8),
>неправильно понимаете. wide char - это UCS2. а UTF8 использует обычные char,
>только в некоторых случаях по несколько на символ
>поддержка UTF-8 там должна отдельно включаться, видимо
>
>\^P^/
КАКИМ ОБРАЗОМ??
>>поддержка UTF-8 там должна отдельно включаться, видимо
>КАКИМ ОБРАЗОМ??
яхз. еслиб знал - не писал бы в неопределенной форме\^P^/
Я пытался решить похожую проблему.
Решение нашёл здесь:
http://namakajiri.net/complog/trouble-using-utf-8-with-ncurses/кратко:
Добавить #include <locale.h> в заголовок и setlocale(LC_CTYPE, ""); до initscr(); после чего наступит счастье.
Я тоже столкнулся с этой проблемой.>Добавить #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;
}
}