簡體   English   中英

printw(ncurses)在C中未顯示正確的字符

[英]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提供字節,例如,使用addchaddstr 在那種情況下, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM