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

标签 c ascii ncurses

我正在使用 ncurses 来做一种模拟城市模拟器。

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

加载良好,但无法显示正确的字符(仅适用于某些字符)。

例如:

在.txt -> 在终端中

│ -> �~T~B

═ -> �~U~P

( -> (

我正在使用http://www.theasciicode.com.ar/对于 ascii 映射

下面是在终端中显示 map 的代码

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 手册的 initialization 部分提到了这一点。 .

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

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

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

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

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

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

#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;
}

关于c - printw (ncurses) 在 c 中不显示正确的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46476245/

相关文章:

c - 如果链接了某些库,可能只包含标题?

c - C 中 ascii 字符串的奇怪行为

Swift 字符串到 ascii 数组 Cyrillic

ncurses - 为什么在 delwin() 之后的 initscr() 返回 undef?

c++ - 如何在 ncurses 中模仿 TTY 行为?当我们到达底部时将屏幕上的所有线向上推?

c++ - 使用 lldb 调试器显示指针值

c - 如果我给指针一个普通值会怎样

c - 从 c 程序在远程主机上执行命令

python - Python 如何处理不可打印字符?

c - ncurses 中的窗口定位