Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.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
printw(ncurses)未在c中显示正确的字符_C_Ascii_Ncurses - Fatal编程技术网

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

printw(ncurses)未在c中显示正确的字符,c,ascii,ncurses,C,Ascii,Ncurses,我用ncurses做了一个模拟城市的模拟器 我在一个.txt文件中有ascii映射,我需要将它加载到终端上 加载很好,但它不会仅显示某些字符的正确字符 例如: 在.txt中->在终端中 nt setUpMap(){ FILE *fp; int c; fp = fopen("./files/map.txt", "r+"); cbreak(); // Read and display data while ((c = fgetc(fp)) != EOF) { switch(c){

我用ncurses做了一个模拟城市的模拟器

我在一个.txt文件中有ascii映射,我需要将它加载到终端上

加载很好,但它不会仅显示某些字符的正确字符

例如:

在.txt中->在终端中

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;
}
│ -> �~T~B

═ -> �~U~P

->

我正在使用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
感谢您提供的任何想法

一般来说,curses将按照您的意愿显示POSIX字符集可打印字符。对于其他方面,还有其他步骤和限制

对于ncurses,您必须初始化区域设置,以便将代码160-255打印为字符。这一点在ncurses手册中关于的章节中提到

但是,如果您的区域设置像典型的开箱即用桌面系统那样使用UTF-8编码,那么ncurses将期望应用程序为UTF-8提供字节,例如使用addch或addstr。printw可能在这种情况下工作,尽管没有人对这种特殊情况的成功或失败发表评论

如果该值为128-159,那么引用addch的某些字节可能是UTF-8编码字符的一部分,并且取决于您是否在ncurses中初始化了区域设置,您将得到不同的结果

无论是128-159还是160-255,当ncurses在显示UTF-8的终端中打印这些值时,您都会得到如图所示的行为

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

因为您的示例使用FGEC,所以我们不需要考虑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

您需要让ncursesw使用它

你的主要目标仍然存在


当你编译时,你把-lncursesw

放进去,我不认为你发布的代码向我们显示了错误。。。我建议您编辑它并发布更多的代码,还有一个.txt文件。@Gam我已经编辑了这篇文章,我的问题现在更清楚了吗?也许可以帮助吗?@QuentinLaillé所以我必须打开输入,然后输出正确的常量?如果您通过printw%d\n,c修改printw;这是您想要的字符吗?我尝试过使用setlocale,就像他们在初始化中说的那样,但它现在打印不同的字符,│ -> M-3