Добавление символов Unicode / UTF8 на дисплей ncurses в C
я пытаюсь добавить символы Юникода wchar_t на дисплей ncurses в C.
у меня есть массив:
wchar_t characters[]={L'uE030', L'uE029'}; // containing 2 thai letters, for example
и позже я попытаюсь добавить wchar_t из массива на дисплей ncurses с помощью:
add_wch(characters[0]);
чтобы предоставить немного больше информации, делать это с ASCII работает нормально, используя:
char characters[]={'A', 'B'};
// and later...
addch(characters[0]);
чтобы настроить локаль, я добавляю include...
#include <locale.h>
// in main()
setlocale(LC_CTYPE,"C-UTF-8");
ncurses включают в себя:
#include <ncurses.h>
компиляция с :
(edit: добавлен стандарт c99 для поддержки универсального имени char.)
gcc -o ncursesutf8 ncursesutf8.c -lm -lncurses -Wall -std=c99
я получаю следующее предупреждение о компиляции (конечно, исполняемый файл не удастся):
ncursesutf8.c:48: warning: implicit declaration of function ‘add_wch’
я пробовал просто с помощью addch
который, кажется, macro'ed для работы с wchar_t, но когда я это делаю, символы Unicode не отображаются, вместо этого они отображаются как символы ASCII.
какие мысли?
я использую OS X Snow Leopard, 10.6.6
Edit: удалена ошибка на wchar_t []
назначение использовать L'u0E30'
вместо L"u0E30"
etc.
Я также обновил настройки компилятора для использования C99 (чтобы добавить поддержку универсального имени char). оба изменения не устраняют проблему.
до сих пор нет ответов на этот вопрос, кто-нибудь знает, как сделать Unicode ncurses addchar
(add_wchar?) ?! Помогите!
4 ответов
широкая поддержка символов обрабатывается ncursesw. В зависимости от вашего дистрибутива, ncurses может или не может указывать там (по-видимому, не в вашем).
попробуйте использовать -lncursesw
вместо -lncurses
.
кроме того, для локали, попробуйте позвонить setlocale(LC_ALL, "")
это не 2 символов:
wchar_t characters[]={L"\uE030", L"\uE029"};
вы пытаетесь инициализировать wchar_t
(целочисленные) значения с указателями, что должно привести к ошибке компилятора. Либо используйте:
wchar_t characters[]={L'\uE030', L'\uE029'};
или
wchar_t characters[]=L"\uE030\uE029";
cchar_t
определено как:
typedef struct {
attr_t attr;
wchar_t chars[CCHARW_MAX];
} cchar_t;
Так что вы можете попробовать:
int add_wchar(int c)
{
cchar_t t = {
0, // .attr
{c, 0} // not sure how .chars works, so best guess
};
return add_wch(t);
}
не проверял, но должно работать.