簡體   English   中英

ncurses中的奇怪擴展字符

[英]strange extended characters in ncurses

我正在編寫一個ncurses應用程序,如何將特殊字符打印到屏幕上存在一個奇怪的問題。 這是一個例子:

#include <ncurses.h>

int main(int argc, char *argv[])
{
  initscr();
  noecho();
  keypad(stdscr, TRUE);
  cbreak();
  curs_set(0);

  addch(ACS_LARROW);
  addch(' ');
  addch(ACS_UARROW);
  addch(' ');
  addch(ACS_DARROW);
  addch(' ');
  addch(ACS_RARROW);
  addch(' ');

  refresh();

  getch();

  endwin();

  return 0;
}

因此,當我在tty上運行此字符時,字符正確地打印為箭頭(←,↑,↓,→),但是當我嘗試在終端上運行它(我在gnome-terminal和LXTerminal上嘗試過)時,這是輸出:

< ^ v >

有什么區別的原因嗎? 我以為可能與字體有關,但是我真的不在這里,而且谷歌搜索沒有幫助。

關於如何強制lxterminal(或任何其他終端)輸出tty相同字符的任何建議?

ncurses根據您的術語類型決定為ACS_LARROW和朋友輸出哪個字符。 在tty中,您的termtype可能設置為“ linux”,而在gnome-terminal等中,很有可能將其設置為“ xterm”。 盡管我不確定,但xterm termtype很可能不支持這些字符。

您可以嘗試這樣運行應用程序:

env TERM=linux ./a.out

可以嘗試使用的其他術語類型是gnome,rxvt和vt102。 這些將輸出擴展的ASCII字符,並且您的終端仿真器應支持它們。 如果已安裝rxvt-unicode,也可以嘗試使用它,它應該為這些特殊符號輸出正確的unicode代碼點。

終端仿真有時以7位ASCII編碼,並且此代碼頁中沒有相應的箭頭值(帶有線和楔形),因此終端顯示附近的內容(即:僅楔形)。 在tty上,您具有計算機的所有功能(UTF-8,顏色編碼等),因此終端可以繪制箭頭。

TERM的設置在很大程度上無關緊要。 重要的是

  • 地區
  • 圖書館的選擇
  • 特定的終端模擬器

通常的原因是該程序是內置並鏈接到ncurses庫的,而不是ncursesw的

  • 如果在使用UTF-8的語言環境中使用前者( ncurses ),則ncurses將僅使用ASCII圖形,因為它無法繪制UTF-8。 ncursesw可以使用UTF-8字符進行繪制。
  • 使用ncursesw ,程序將根據需要使用UTF-8(自2002年起 ,它可以使用terminfo信息或Unicode值的內置表)。 Linux控制台和screen是terminfo無法描述終端行為的已知特殊情況。 對於其他終端(在UTF-8模式下不支持VT100線描的終端),應設置NCURSES_NO_UTF8_ACS
  • 實際上,終端數據庫確實具有擴展的功能,可以解決VT100與UTF-8的兼容性不足(請參閱終端數據庫中的U8注意 )。 但是,大多數人將TERM設置為xtermlinux並且經常將它們等同(請參閱xterm FAQ中的注釋)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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