使用ncurses在C中打印Unicode字符 [英] Print Unicode characters in C, using ncurses

查看:242
本文介绍了使用ncurses在C中打印Unicode字符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我必须在C中绘制一个盒子,使用ncurses;

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

  #define RB\e(0 \x6a\e(B(例如ASCII 188,右下)

我使用gcc编译了Ubuntu,并使用 -finput-charset = UTF-8 flag。



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

解决方案

有几个问题:


I have to draw a box in C, using ncurses;

First, I have defined some values for simplicity:

#define RB "\e(0\x6a\e(B"  (ASCII 188,Right bottom, for example)

I have compiled with gcc, over Ubuntu, with -finput-charset=UTF-8 flag.

But, if I try to print with addstr or printw, I get the hexa code. What I`m doing wrong?

解决方案

A few issues:

  • if your program writes something like "\e(0\x6a\e(B" using addstr, then ncurses (any curses implementation) will translate the individual characters to printable form as described in the addch manual page.
  • ncurses supports line-drawing for commonly-used pseudo-graphics using symbols (such as ACS_HLINE) which are predefined characters with the A_ALTCHARSET attribute combined. You can read about those in the Line Graphics section of the addch manual page.
  • the code 0x6a is ASCII j, which (given a VT100-style mapping) would be the lower left corner. The curses symbol for that is ACS_LRCORNER.
  • you cannot write the line-drawing characters with addstr; instead addch, addchstr are useful. There are also functions oriented to line-drawing (see box and friends).
  • running in Ubuntu, your locale encoding is probably UTF-8. To make your program work properly, it should initialize the locale as described in the Initialization section of the ncurses manual page. In particular:

    setlocale(LC_ALL, "");

    Also, your program should link against the ncursesw library (-lncursesw) to use UTF-8, rather than just ncurses (-lncurses).

  • when compiling on Ubuntu, to use the proper header definitions, you should define _GNU_SOURCE.

这篇关于使用ncurses在C中打印Unicode字符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆