我正在使用 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 的字节,例如,使用 addch
或addstr
。 printw
可能在这种情况下工作,尽管没有人评论这种特殊情况的成功(或失败)。
如果该值为 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/