【问题标题】:printw (ncurses) not displaying correct char in cprintw(ncurses)没有在c中显示正确的字符
【发布时间】:2017-09-28 18:43:00
【问题描述】:

我正在使用 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

感谢您的任何想法

【问题讨论】:

  • 我不认为您发布的代码向我们显示了错误...我建议您编辑它并发布更多代码,并附上一段 .txt 文件。
  • @Gam 我已经编辑了帖子,我的问题现在更清楚了吗?
  • 也许this 可以帮忙?
  • @QuentinLaillé 所以我必须对输入进行切换然后输出正确的常量?
  • 如果你用printw("%d\n", c);修改printw()是你想要的字符吗?

标签: c ascii ncurses


【解决方案1】:

一般来说,curses 将按照您的意图显示 POSIX 字符集 可打印 字符。对于其他任何事情,还有其他步骤(和限制)。

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

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

如果值为 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;
}

【讨论】:

  • 我曾尝试像他们在初始化时所说的那样使用 setlocale,但现在它会打印不同的字符,│ -> M-3
【解决方案2】:

要使用扩展的 ascii 字符,你需要使用nurses 而不是 ncurses

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

main 中的 include 仍然是 #&lt;ncurses.h&gt;

当你编译时,你把 -lncursesw

【讨论】:

    猜你喜欢
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    相关资源
    最近更新 更多