【问题标题】:Adding Unicode/UTF8 chars to a ncurses display in C将 Unicode/UTF8 字符添加到 C 中的 ncurses 显示
【发布时间】:2011-06-09 20:16:05
【问题描述】:

我正在尝试将 wchar_t Unicode 字符添加到 C 中的 ncurses 显示中。

我有一个数组:

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

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" 等。 我还更新了编译器设置以使用 C99(添加通用字符名称支持)。两种更改都不能解决问题。

对此仍然没有答案,有人知道如何做 Unicode ncurses addchar (add_wchar?) 吗?!帮助!

【问题讨论】:

  • 另外请注意,除了"" 之外,您不应该将任何字符串传递给setlocale。传递"" 会导致获取配置/系统语言环境,基于任何现代系统,它应该是UTF-8。像"C-UTF-8" 这样的名字是不可移植的。

标签: c utf-8 ncurses


【解决方案1】:

宽字符支持由 ncursesw 处理。根据您的发行版,ncurses 可能会或可能不会指向那里(似乎不在您的发行版中)。

尝试使用-lncursesw 而不是-lncurses

另外,对于语言环境,请尝试调用setlocale(LC_ALL, "")

【讨论】:

  • 另外,请注意对setlocale 的调用必须在initscr() 之前。
【解决方案2】:

不是 2 个字符:

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

您正在尝试使用指针初始化 wchar_t(整数)值,这会导致编译器出错。要么使用:

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

wchar_t characters[]=L"\uE030\uE029";

【讨论】:

  • 感谢您的提示,但这并不能解决问题,请参阅上面的编辑。有什么想法吗?
  • @R ...你有没有机会回答这个问题?
【解决方案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);
}

根本没有经过测试,但应该可以工作。

【讨论】:

  • 我试试看,希望你猜对了;)
  • 好吧,那没用,CCHARW_MAX 是未定义的,我真的不知道你是怎么想出来的,一些解释会很有帮助。我还必须将 cchar_t 结构添加到源代码中,按照您的说法,推断它已经定义(大概在 ncurses 中)。
  • 等等,你有 add_wch吗?我的文档有它,但它显然没有在我的 ncurses.h 中定义。
  • 我有 add_wch 但它似乎不起作用(终端输出是 ? 代替我正在使用的泰国 unicode 字符,否则显示正常,例如,如果我输入它们直接进入终端提示符。)
  • 好吧,那我难住了。 (您帖子中的警告似乎暗示您没有add_wch,您还知道吗?)也许发布/链接您的ncurses.h?
【解决方案4】:

您是否在包含 ncurses 标头之前定义了 _XOPEN_SOURCE_EXTENDED

【讨论】:

  • 我最终在 Lisp 而不是 C 中这样做了。:)
猜你喜欢
  • 2020-08-31
  • 2023-03-11
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
相关资源
最近更新 更多