繁体   English   中英

printw(ncurses)在C中未显示正确的字符

[英]printw (ncurses) not displaying correct char in c

我正在使用ncurses进行某种模拟城市模拟器。

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

加载效果不错,但显示的角色不正确(仅适用于某些角色)。

例如:

在.txt->在终端

│-> 〜T〜B

═-> 〜U〜P

(->(

我正在使用http://www.theasciicode.com.ar/来绘制ascii地图

波纹管是在终端中显示地图的代码

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

谢谢你的任何想法

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

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

但是,如果您的语言环境使用UTF-8编码(就像典型的现成的“桌面”系统一样),则ncurses期望应用程序为UTF-8提供字节,例如,使用addchaddstr 在那种情况下, printw 可能会起作用,尽管没有人对这种特殊情况的成功(或失败)发表评论。

如果该值为128-159,则其中某些字节(指addch )可能是UTF-8编码字符的一部分,并且取决于是否以ncurses初始化语言环境,您将获得不同的结果。

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

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

由于您的示例使用了fgetc ,因此我们不需要考虑大于255的值。

假设您的示例位于UTF-8中,此程序(与ncursesw链接, 宽字符库 )将按预期显示文本:

#include <curses.h>
#include <locale.h>

int
main(void)
{
    FILE *fp;
    int c;

    setlocale(LC_ALL, "");

    fp = fopen("./files/map.txt", "r");
    if (fp == 0)
        return 1;

    initscr();
    cbreak();
    noecho();

    // Read and display data 

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

    fclose(fp);

    return 0;
}

要使用扩展的ascii角色,您需要使用Nursesw而不是ncurses

您将需要apt-get ncursesw才能使用它

主目录中的include仍然保持#<ncurses.h>

编译时,您将-lncursesw

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM