[英]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提供字节,例如,使用addch
或addstr
。 在那种情况下, 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.