我正在使用newt/snack (一个基于俚语的Python的TUI图形Widgit库)来实现一些交互式脚本。然而,对于一些目标终端来说,这些屏幕的输出并不是很好。我可以通过更改$TERM变量来更改它们的外观,以删除不可打印的字符,并将它们转换为更合适的字符。例如:
TERM=linux python myscript.py到目前为止,我为$TERM测试的值只产生了中等程度的成功。
是否存在一致转换图形字符的$TERM的已知值:
┌────────────┤ Title ├────────────┐
│ │
│ Some text for the entry window │
│ │
│ foo _______________________ │
│ bar _______________________ │
│ baz _______________________ │
│ │
│ ┌────┐ ┌────────┐ │
│ │ Ok │ │ Cancel │ │
│ └────┘ └────────┘ │
│ │
└─────────────────────────────────┘转换为非图形字符:
+------------| Title |------------+
| |
| Some text for the entry window |
| |
| foo _______________________ |
| bar _______________________ |
| baz _______________________ |
| |
| +----+ +--------+ |
| | Ok | | Cancel | |
| +----+ +--------+ |
| |
+---------------------------------+发布于 2017-05-22 05:27:14
short: no - it (纽特和俚语)就是不做。
long:
newt使用如下所示的函数SLsmg_draw_box作为参考:
void SLsmg_draw_box (int r, int c, unsigned int dr, unsigned int dc)
{
if (Smg_Mode == SMG_MODE_NONE) return;
if (!dr || !dc) return;
This_Row = r; This_Col = c;
dr--; dc--;
SLsmg_draw_hline (dc);
SLsmg_draw_vline (dr);
This_Row = r; This_Col = c;
SLsmg_draw_vline (dr);
SLsmg_draw_hline (dc);
SLsmg_draw_object (r, c, SLSMG_ULCORN_CHAR);
SLsmg_draw_object (r, c + (int) dc, SLSMG_URCORN_CHAR);
SLsmg_draw_object (r + (int) dr, c, SLSMG_LLCORN_CHAR);
SLsmg_draw_object (r + (int) dr, c + (int) dc, SLSMG_LRCORN_CHAR);
This_Row = r; This_Col = c;
}在slsmg.c文件中,slang有一个表:
typedef struct
{
unsigned char vt100_char;
unsigned char ascii;
SLwchar_Type unicode; /* may have an ambiguous width */
SLwchar_Type unicode_narrow; /* has a narrow width */
}
ACS_Def_Type;
static SLCONST ACS_Def_Type UTF8_ACS_Map[] =
{
{'+', '>', 0x2192, '>'}, /* RIGHTWARDS ARROW [A] */
{',', '<', 0x2190, '<'}, /* LEFTWARDS ARROW [A] */
{'-', '^', 0x2191, 0x2303}, /* UPWARDS ARROW [A] */
{'.', 'v', 0x2193, 0x2304}, /* DOWNWARDS ARROW [A] */但是,如果应用程序(newt)告诉它使用UTF-8编码,它将自动选择Unicode值。newt无条件地执行此操作,忽略终端和区域设置信息:
/**
* @brief Initialize the newt library
* @return int - 0 for success, else < 0
*/
int newtInit(void) {
char * MonoValue, * MonoEnv = "NEWT_MONO";
const char *lang;
int ret;
if ((lang = getenv("LC_ALL")) == NULL)
if ((lang = getenv("LC_CTYPE")) == NULL)
if ((lang = getenv("LANG")) == NULL)
lang = "";
/* slang doesn't support multibyte encodings except UTF-8,
avoid character corruption by redrawing the screen */
if (strstr (lang, ".euc") != NULL)
trashScreen = 1;
(void) strlen(ident);
SLutf8_enable(-1);
SLtt_get_terminfo();
SLtt_get_screen_size();回到slsmg.c,init_acs()函数将首先尝试使用Unicode (如果您的区域设置支持UTF-8,则总是成功)。如果它碰巧是其他东西,则函数继续使用终端描述中存在的任何信息。
通常,如果终端支持线条绘制字符,则会编写每个终端描述以告知如何绘制线条。如果你用修改终端描述来删除那些功能,你可能只会得到ASCII (但这是基于读取函数: slang有许多硬编码的用例,用来填充行为不像slang作者想要的终端描述,你可能会被其中一个绊倒)。
无论如何,slang使用的terminfo功能是:acsc,enacs,rmacs,smacs.
发布于 2011-01-05 16:08:15
它可能基于您的$LANG被设置为类似于en_US.UTF-8的内容。尝试将其更改为en_US (假设您的基本区域设置为en_US)。
https://stackoverflow.com/questions/2332773
复制相似问题