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

не проверял, но должно работать.


вы определить _XOPEN_SOURCE_EXTENDED перед включением заголовка ncurses?