0

我正在使用 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 |     |
|    +----+        +--------+     |
|                                 |
+---------------------------------+
4

2 回答 2

1

简短:不 - 它(蝾螈和俚语)根本不这样

长:

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文件中,俚语确实有一个表格:

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(但这只是基于读取函数:俚语有许多硬编码案例,旨在填充与俚语作者不相符的终端描述,你可能会绊倒其中一个)。

值得一提的是,俚语使用的 terminfo 功能是:acsc, enacs, rmacs, smacs.

于 2017-05-21T21:27:14.173 回答
0

它可能基于您$LANG被设置为类似en_US.UTF-8. 尝试将其更改为en_US(假设您的基本语言环境是en_US)。

于 2011-01-05T08:08:14.637 回答