Я закончил тем, что делал это на Лиспе вместо Си :)

аюсь добавить символы 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 <locale.h>

// in main()
setlocale(LC_CTYPE,"C-UTF-8");

Курсы включают в себя:

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

До сих пор нет ответов на этот вопрос, кто-нибудь знает, как сделать Uncode ncursesaddchar (add_wchar?)?! Помогите!

 R..16 янв. 2011 г., 03:08
Также обратите внимание, что вы никогда не должны передавать какую-либо строку, но"" вsetlocale, Переходя"" приводит к получению настроенного / системного языкового стандарта, который должен быть UTF-8 на основе любой современной системы. Имена как"C-UTF-8" не переносимы

Ответы на вопрос(4)

cchar_t определяется как:

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

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

 ocodo26 янв. 2011 г., 07:52
Ну, это не сработало, CCHARW_MAX не определено, я действительно понятия не имею, как вы пришли к этому, некоторые объяснения были бы полезны. Я также должен был добавитьcchar_t struct к источнику, они, как вы выразились, сделали вывод, что он уже определен (предположительно в ncurses).
 ocodo12 февр. 2011 г., 07:59
у меня естьadd_wch но это не похоже на работу (вывод терминала? вместо тайских символов Юникода, которые я использую, которые отображаются нормально, например, если я введу их непосредственно в подсказку терминала.)
 ocodo25 янв. 2011 г., 04:55
Я попробую, надеюсь, ты угадаешь;)
 David X12 февр. 2011 г., 09:26
Хорошо, тогда я в тупике. (Предупреждение в вашем посте означает, что у вас нетadd_wch, вы все еще получаете это?) Может опубликовать / связать ваш ncurses.h?
 David X26 янв. 2011 г., 08:51
Подождиимеют add_wch? В моей документации это есть, но оно явно не определено в моем ncurses.h.

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

 ocodo29 дек. 2012 г., 03:37
Я закончил тем, что делал это на Лиспе вместо Си :)

Этоне 2 персонажа:

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

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

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

или же

wchar_t characters[]=L"\uE030\uE029";
 ocodo16 янв. 2011 г., 05:06
Спасибо за совет, но это не решает проблему, см. Мои правки выше. Есть идеи?
 ocodo26 янв. 2011 г., 07:53
@R ... есть ли шанс, что у тебя есть ответ на этот вопрос?
Решение Вопроса

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

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

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

 g33kz0r20 мар. 2013 г., 01:28
Также обратите внимание, что звонок наsetlocale должен предшествоватьinitscr().

Ваш ответ на вопрос