簡體   English   中英

使用 ncurses 在 C 中打印 Unicode 字符

[英]Print Unicode characters in C, using ncurses

我必須使用 ncurses 在 C 中繪制一個框;

首先,為簡單起見,我定義了一些值:

#define RB "\e(0\x6a\e(B"  (ASCII 188,Right bottom, for example)

我在 Ubuntu 上用 gcc 編譯,帶有-finput-charset=UTF-8標志。

但是,如果我嘗試使用 addstr 或 printw 進行打印,我會得到六進制代碼。 我做錯了什么?

ncurses定義了值ACS_HLINEACS_VLINEACS_ULCORNERACS_URCORNERACS_LLCORNERACS_LRCORNER 您可以在addch和 friends 中使用這些常量,這應該會導致您看到預期的框字符。 (還有更多 ACS 字符;您可以在man addch中找到完整列表。)

ncurses需要知道它在畫什么,因為它需要始終准確知道光標所在的位置。 輸出控制台控制序列不是一個好主意; 如果 ncurses 知道如何處理序列,它有自己的功能抽象,您應該使用該抽象。 ACS(“備用字符集”)定義的是這些抽象之一。

幾個問題:

  • 如果您的程序使用addstr編寫類似"\e(0\x6a\e(B"的內容,則 ncurses(任何curses 實現)會將單個字符轉換為可打印形式,如addch手冊頁中所述。
  • ncurses 支持使用符號(例如ACS_HLINE )為常用的偽圖形繪制線條,這些符號是預定義字符與A_ALTCHARSET屬性組合。 您可以在addch手冊頁的線圖部分閱讀有關內容。
  • 代碼0x6a是 ASCII j ,它(給定 VT100 樣式映射)將位於左下角。 curses 符號是ACS_LRCORNER
  • 不能用addstr寫畫線字符; 相反addchaddchstr很有用。 還有面向畫線的功能(見box和朋友)。
  • 在 Ubuntu 中運行,您的語言環境編碼可能是 UTF-8。 為了使您的程序正常工作,它應該按照 ncurses 手冊頁的初始化部分中的描述初始化語言環境。 特別是:

    設置語言環境(LC_ALL,“”);

    此外,您的程序應該鏈接到 ncurses w庫 ( -lncursesw ) 以使用 UTF-8,而不僅僅是 ncurses ( -lncurses )。

  • 在 Ubuntu 上編譯時,要使用正確的標頭定義,您應該定義_GNU_SOURCE

順便說一句,也許我可能來晚了,但我會給你一些見解,可能會或不會為你的“盒子繪圖”需求提供一些啟發和技巧。

截至 2020 年,我參與了一個有趣的項目,我自己混合了 Swift + Ncurses(目前在 OSX 下,但考慮將其與 linux 混合)。 顯然它完美無缺。

問題是,當我使用 Swift 時,它在內部都減少為來自 MacOS Xcode/runtime 提供的一些 Darwin.ncurses 庫的“importing.h and.c”文件。

這意味着(我希望)我新獲得的技能可能對您有用,因為顯然我們正在使用完全相同的 .h 和 .c 文件來滿足我們的 ncurses 需求。 (或者至少他們應該非常相似)

說:


截至目前,我“忽略”了 ACS_corner 字符(我在 swift/Xcode/Darwin.ncurses 運行時找不到它們,,:) 支持純 UTF“角字符”,它也存在於 unicode 點空間中,看:

https://en.wikipedia.org/wiki/Box-drawing_character

這是什么意思? 每當我想在周圍使用一些繪圖框字符時,我只需將純 UTF-8 字符復制並粘貼到我的字符串中,然后將這些字符串發送到 addstr。

為什么它有效? 因為正如上面有人回答的那樣,在使用 initscr() 初始化 ncurses 之前,我只是以 setlocale(LC_ALL, ""); 的形式聲明“我想要適當的語言環境支持”; 線。

我取得了什么成就? 顯然是純粹的魔法。 而且非常舒服,因為我只是在我的普通字符串中復制粘貼框字符。 至少在 Darwin.ncurses/OSX Mojave 下,我得到的不僅是“邊界框字符”,還有完整的 UTF8 支持。

試試 "setlocale(LC_ALL, ""); initscr();" 方法並告訴我們“繪圖框”是否也適用於僅使用 UTF8 邊界框字符的純 C 環境。

問候和快樂 ncursing!

暫無
暫無

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

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