Добавление символов Unicode/UTF8 в отображение ncurses в C
Я пытаюсь добавить символы wchar_t Unicode к экрану 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>
Компиляция с помощью:
(изменить: добавлен стандарт c99, для универсальной поддержки имени char.)
gcc -o ncursesutf8 ncursesutf8.c -lm -lncurses -Wall -std=c99
Я получаю следующее предупреждение компиляции (конечно, исполняемый файл не работает):
ncursesutf8.c:48: warning: implicit declaration of function ‘add_wch’
Я пробовал использовать addch
, который, как представляется, макросохраняется для работы с wchar_t, но когда я это делаю, символы Unicode не отображаются, вместо этого они отображаются как символы ASCII.
Любые мысли?
Я использую OS X Snow Leopard, 10.6.6
Изменить: удалить ошибку при назначении wchar_t []
для использования L'\u0E30'
вместо L"\u0E30"
и т.д.
Я также обновил параметры компилятора, чтобы использовать C99 (для добавления универсальной поддержки имени char). оба изменения не устраняют проблему.
По-прежнему нет ответов на это, кто-нибудь знает, как делать Unicode ncurses addchar
(add_wchar?)?! Помогите!
Ответы
Ответ 1
Широкая поддержка символов обрабатывается ncursesw. В зависимости от вашего дистрибутива, ncurses могут или не могут указывать там (по-видимому, не в вашем).
Попробуйте использовать -lncursesw
вместо -lncurses
.
Кроме того, для локали попробуйте позвонить setlocale(LC_ALL, "")
Ответ 2
Это не 2 символа:
wchar_t characters[]={L"\uE030", L"\uE029"};
Вы пытаетесь инициализировать значения wchar_t
(integer) с помощью указателей, что должно привести к ошибке из компилятора. Либо используйте:
wchar_t characters[]={L'\uE030', L'\uE029'};
или
wchar_t characters[]=L"\uE030\uE029";
Ответ 3
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);
}
вообще не тестировался, но должен работать.
Ответ 4
Определяли ли вы _XOPEN_SOURCE_EXTENDED
перед включением заголовка ncurses?