printw(ncurses)在c

时间:2017-09-28 18:43:00

标签: c ascii ncurses

我使用ncurses做一种sim城市模拟器。

我在.txt中有ascii map,我需要在终端上加载它。

加载很好,但它没有显示正确的字符(仅限某些字符)。

例如:

in .txt - >在终端

│ - > 〜T〜乙

= - > 〜U〜P

( - >(

我使用http://www.theasciicode.com.ar/作为ascii地图

bellow是在终端

中显示地图的代码
nt setUpMap(){

FILE *fp;
int c;

fp = fopen("./files/map.txt", "r+");

cbreak();

// Read and display data 

while ((c = fgetc(fp)) != EOF)
{
    switch(c){
        case 'p' :
            // todo : emoji
        break;
        default:
            printw("%c", c);
        break;
    }    
}

fclose(fp);

return 0;
}

.txt:

的内容示例
┌───────────────────────┐
│   []   []   []   []   │
│ []  []   []   []   [] │
│   []   []   []   []   │
│                       │
│   ┌──┐       ┌──┐     │
└───┘  └───────┘  └─────┘

终端输出:

�~T~L�~T~@�~T~@�~T~@�~T~@�~T~@�~T~@�~T~@�~T~@�~T~@�~T~@�~T~@�~T~@�~T~@    �~T~@�~T~@�~T~@�~T~@�~T~@�~T~@�~T~@�~T~@�~T~@�~T~@�~T~P
�~T~B   []   []   []   []   �~T~B
�~T~B []  []   []   []   [] �~T~B
�~T~B   []   []   []   []   �~T~B
�~T~B                       �~T~B
�~T~B   �~T~L�~T~@�~T~@�~T~P       �~T~L�~T~@�~T~@�~T~P     �~T~B
�~T~T�~T~@�~T~@�~T~@�~T~X       �~T~T�~T~@�~T~@�~T~@�~T~@�~T~@�~T~@�~T~@�~T~X      �~T~T�~T~@�~T~@�~T~@�~T~@�~T~@�~T~X

感谢任何想法

2 个答案:

答案 0 :(得分:0)

一般来说, curses 会按预期显示POSIX字符集可打印字符。除此之外,还有其他步骤(和限制)。

对于 ncurses ,您必须初始化语言环境,以使其将代码160-255打印为字符。在initialization的ncurses手册部分中提到了这一点。

但是如果您的语言环境使用UTF-8编码(如典型的开箱即用“桌面”系统那样),那么ncurses将期望应用程序提供UTF-8的字节,例如,使用{{ 1}}或addchaddstr 可能在这种情况下工作,尽管没有人对该特殊情况的成功(或失败)发表评论。

如果值为128-159,那些字节中的一些(引用printw)可能是UTF-8编码字符的一部分,并且根据您是否在ncurses中初始化语言环境,您会得到不同的结果

无论哪种方式(128-159或160-255),当ncurses在显示UTF-8的终端中打印这些值时,您将获得所示的行为。

0-255范围内的其他值是控制字符。

由于您的示例使用addch,因此我们无需考虑高于255的值。

假设您的示例是UTF-8,此程序(与 ncursesw 链接,wide-character library)将按预期显示文本:

fgetc

答案 1 :(得分:0)

要使用扩展的ascii caracters,您需要使用nursesw而不是ncurses

你需要apt-get ncursesw来使用它

主要内容仍包含#<ncurses.h>

编译时,你把-lncursesw