Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ncurses以C语言打印Unicode字符_C_String_Gcc_Unicode_Ncurses - Fatal编程技术网

使用ncurses以C语言打印Unicode字符

使用ncurses以C语言打印Unicode字符,c,string,gcc,unicode,ncurses,C,String,Gcc,Unicode,Ncurses,我必须用C语言画一个方框,使用ncurses 首先,为了简单起见,我定义了一些值: #define RB "\e(0\x6a\e(B" (ASCII 188,Right bottom, for example) 我已经在Ubuntu上用gcc编译了,带有-finput charset=UTF-8标志 但是,如果我尝试使用addstr或printw打印,我会得到hexa代码。 我做错了什么?ncurses定义了值ACS\u HLINE,ACS\u VLINE,ACS\u ULCORNER,AC

我必须用C语言画一个方框,使用ncurses

首先,为了简单起见,我定义了一些值:

#define RB "\e(0\x6a\e(B"  (ASCII 188,Right bottom, for example)
我已经在Ubuntu上用gcc编译了,带有
-finput charset=UTF-8
标志

但是,如果我尝试使用addstr或printw打印,我会得到hexa代码。
我做错了什么?

ncurses
定义了值
ACS\u HLINE
ACS\u VLINE
ACS\u ULCORNER
ACS\u URCORNER
ACS\u LLCORNER
ACS\u lcorner
。您可以在
addch
和friends中使用这些常量,这将导致您看到预期的框字符。(还有更多的ACS字符;您可以在
man addch
中找到完整的列表)

ncurses
需要知道它在画什么,因为它需要知道光标一直在哪里。输出控制台控制序列不是一个好主意;如果ncurses知道如何处理序列,那么它对特性有自己的抽象,您应该使用该抽象。ACS(“替代字符集”)定义就是这些抽象之一。

一些问题:

  • 如果您的程序使用编写类似于
    “\e(0\x6a\e(B”
    )的内容,那么ncurses(任何curses实现)将按照手册页面中的说明将单个字符转换为可打印的形式
  • ncurses支持使用符号(如
    ACS\u HLINE
    )为常用的伪图形绘制线条,这些符号是与
    A\u ALTCHARSET
    属性相结合的预定义字符。您可以在
    addch
    手册页面的一节中了解这些符号
  • 代码
    0x6a
    是ASCII
    j
    ,它(给定VT100样式映射)将位于左下角。其诅咒符号是
    ACS\lru corner
  • 您不能使用
    addstr
    来书写划线字符;相反,
    addch
    非常有用。还有一些面向划线的函数(请参阅和朋友)
  • 在Ubuntu中运行时,您的区域设置编码可能是UTF-8。为了使您的程序正常工作,它应该按照ncurses手册页面的一节中所述初始化区域设置。特别是:

    setlocale(LC_ALL,“”)

    此外,您的程序应该链接到ncursesw库(
    -lncursesw
    ),以使用UTF-8,而不仅仅是ncurses(
    -lncurses

  • 在Ubuntu上编译时,要使用正确的头定义,您应该定义
    \u GNU\u SOURCE

顺便说一句,我可能会在聚会上迟到一些,但我会给你一些见解,也许能为你的“画框”需求提供一些启发和技巧

到2020年,我自己参与了一个有趣的项目,将Swift+Ncurses混合在一起(目前在OSX下,但正在考虑将其与linux混合)。显然,它工作得完美无缺

问题是,在我使用Swift时,在内部,它会从MacOS Xcode/runtime提供的Darwin.ncurses库中“导入.h和.c”文件

这意味着(我希望)我新学到的技能可能会对您有用,因为显然我们使用的是相同的.h和.c文件来满足我们的课程需求。(或者至少它们应该非常相似)

他说:


到目前为止,我“忽略”了ACS_角字符(我在swift/Xcode/Darwin.ncurses runtime!!!)中找不到它们),而支持纯UTF“角字符”,它也存在于unicode点空间中,请看:

这意味着什么?每当我想使用一些绘图框字符时,我只需将纯UTF-8字符复制粘贴到字符串中,然后将这些字符串发送到addstr

为什么它能工作?因为正如上面有人回答的那样,在使用initscr()初始化ncurses之前,我只是以setlocale(LC_ALL,“”)行的形式声明“我需要适当的区域设置支持”

我实现了什么?显然是纯魔法。而且非常舒服,因为我只是在我的普通字符串中复制粘贴框字符。至少在Darwin.ncurses/OSX Mojave下,我得到的不仅是“边界框字符”,而且是完全的UTF8支持

尝试“setlocale(LC_ALL,”;initscr();”方法,告诉我们“绘图框”是否也适用于纯C环境,只需使用UTF8边界框字符


您好,祝您快乐!您能发布您用于打印的代码吗?您是否考虑过使用ncurses
border
功能?此外,您不需要
-finput charset=UTF-8
,首先是因为它将是默认的,其次是因为您的源代码中没有一个非ascii字符(或者至少是您与我们共享的部分),这就是
-finput charset
所指的:源代码本身的字符集。