[英]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_HLINE
、 ACS_VLINE
、 ACS_ULCORNER
、 ACS_URCORNER
、 ACS_LLCORNER
和ACS_LRCORNER
。 您可以在addch
和 friends 中使用這些常量,這應該會導致您看到預期的框字符。 (還有更多 ACS 字符;您可以在man addch
中找到完整列表。)
ncurses
需要知道它在畫什么,因為它需要始終准確知道光標所在的位置。 輸出控制台控制序列不是一個好主意; 如果 ncurses 知道如何處理序列,它有自己的功能抽象,您應該使用該抽象。 ACS(“備用字符集”)定義的是這些抽象之一。
幾個問題:
"\e(0\x6a\e(B"
的內容,則 ncurses(任何curses 實現)會將單個字符轉換為可打印形式,如addch手冊頁中所述。ACS_HLINE
)為常用的偽圖形繪制線條,這些符號是預定義字符與A_ALTCHARSET
屬性組合。 您可以在addch
手冊頁的線圖部分閱讀有關內容。0x6a
是 ASCII j
,它(給定 VT100 樣式映射)將位於左下角。 curses 符號是ACS_LRCORNER
。addstr
寫畫線字符; 相反addch
, addchstr
很有用。 還有面向畫線的功能(見box
和朋友)。在 Ubuntu 中運行,您的語言環境編碼可能是 UTF-8。 為了使您的程序正常工作,它應該按照 ncurses 手冊頁的初始化部分中的描述初始化語言環境。 特別是:
設置語言環境(LC_ALL,“”);
此外,您的程序應該鏈接到 ncurses w庫 ( -lncursesw
) 以使用 UTF-8,而不僅僅是 ncurses ( -lncurses
)。
_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.