首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TUI通过termcap使用带有纯ascii (7位)字符的俚语

TUI通过termcap使用带有纯ascii (7位)字符的俚语
EN

Stack Overflow用户
提问于 2010-02-25 17:04:27
回答 2查看 536关注 0票数 0

我正在使用newt/snack (一个基于俚语的Python的TUI图形Widgit库)来实现一些交互式脚本。然而,对于一些目标终端来说,这些屏幕的输出并不是很好。我可以通过更改$TERM变量来更改它们的外观,以删除不可打印的字符,并将它们转换为更合适的字符。例如:

代码语言:javascript
复制
TERM=linux python myscript.py

到目前为止,我为$TERM测试的值只产生了中等程度的成功。

是否存在一致转换图形字符的$TERM的已知值:

代码语言:javascript
复制
┌────────────┤ Title ├────────────┐
│                                 │
│ Some text for the entry window  │
│                                 │
│   foo _______________________   │
│   bar _______________________   │
│   baz _______________________   │
│                                 │
│    ┌────┐        ┌────────┐     │
│    │ Ok │        │ Cancel │     │
│    └────┘        └────────┘     │
│                                 │
└─────────────────────────────────┘

转换为非图形字符:

代码语言:javascript
复制
+------------| Title |------------+
|                                 |
| Some text for the entry window  |
|                                 |
|   foo _______________________   |
|   bar _______________________   |
|   baz _______________________   |
|                                 |
|    +----+        +--------+     |
|    | Ok |        | Cancel |     |
|    +----+        +--------+     |
|                                 |
+---------------------------------+
EN

回答 2

Stack Overflow用户

发布于 2017-05-22 05:27:14

short: no - it (纽特和俚语)就是不做

long:

newt使用如下所示的函数SLsmg_draw_box作为参考:

代码语言:javascript
复制
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有一个表:

代码语言:javascript
复制
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无条件地执行此操作,忽略终端和区域设置信息:

代码语言:javascript
复制
/** 
 * @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.cinit_acs()函数将首先尝试使用Unicode (如果您的区域设置支持UTF-8,则总是成功)。如果它碰巧是其他东西,则函数继续使用终端描述中存在的任何信息。

通常,如果终端支持线条绘制字符,则会编写每个终端描述以告知如何绘制线条。如果你用修改终端描述来删除那些功能,你可能只会得到ASCII (但这是基于读取函数: slang有许多硬编码的用例,用来填充行为不像slang作者想要的终端描述,你可能会被其中一个绊倒)。

无论如何,slang使用的terminfo功能是:acscenacsrmacssmacs.

票数 1
EN

Stack Overflow用户

发布于 2011-01-05 16:08:15

它可能基于您的$LANG被设置为类似于en_US.UTF-8的内容。尝试将其更改为en_US (假设您的基本区域设置为en_US)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2332773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档