[英]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.