Добавление символов Unicode / UTF8 на экран ncurses в C - PullRequest
11 голосов
/ 16 января 2011

Я пытаюсь добавить символы Unicode 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> 

Компиляция с:

(правка: добавлен стандарт c99, для поддержки универсального имени символа.)

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" и т. Д. Я также обновил setti компилятораngs для использования C99 (чтобы добавить поддержку универсального имени символа).оба изменения не решают проблему.

Все еще нет ответов на этот вопрос, кто-нибудь знает, как сделать Unicode ncurses addchar (add_wchar?)?!Помогите!

Ответы [ 4 ]

19 голосов
/ 06 июня 2011

Поддержка широких символов обрабатывается ncursesw.В зависимости от вашего дистрибутива ncurses может указывать или не указывать на него (по-видимому, не в вашем).

Попробуйте использовать -lncursesw вместо -lncurses.

Также для локали попробуйте позвонитьsetlocale(LC_ALL, "")

2 голосов
/ 16 января 2011

Это , а не 2 символа:

wchar_t characters[]={L"\uE030", L"\uE029"};

Вы пытаетесь инициализировать wchar_t (целочисленные) значения указателями, что должно привести к ошибке компилятора. Либо использовать:

wchar_t characters[]={L'\uE030', L'\uE029'};

или

wchar_t characters[]=L"\uE030\uE029";
1 голос
/ 29 декабря 2012

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

1 голос
/ 25 января 2011

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);
}

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

...