Добавление символов 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?