O que meu emulador de terminal deve fazer com códigos de controle DC1?

1

Estou escrevendo um emulador de terminal compatível com ansi e estou implementando códigos de controle diferentes na ordem em que os encontro. Uma peculiaridade ao usar lynx é uma infinidade de DC1 / XON códigos de controle ( 0x11 ). Mas eles não pretendem realmente ser esses códigos de controle. Eu observei em LXTerminal que eles são renderizados com um glifo de setas, e o layout de toda a página em lince torna aparente que eles pretendem que ele funcione dessa maneira.

Existe uma especificação conhecida ou implementação de referência que especifica 0x11 como um caractere imprimível em vez de DC1 ?

Editar :

Esta seta circulada é o que o xterm produz para esse código, mas não tenho certeza porque , quando minha codificação é UTF-8, DC1 deve ser enviada dessa forma.

    
por Jacob 30.01.2016 / 21:02

2 respostas

2

Se você está vendo controle Q (0x11) e controle S (0x13), estes são XON / XOFF: artefatos de controle de fluxo. Você só deve vê-los se a sua conexão diz que depende do controle de fluxo de software; o driver do terminal pode enviá-los para o dispositivo (assim como um usuário pode pressionar essas teclas para controlar a outra direção).

Leitura adicional:

O comentário sobre "layout" para o Lynx é obscuro:

  • 0x11 não é um caractere de espaço em branco em nenhum conjunto de caracteres que vem à mente.
  • olhando para os conjuntos de caracteres que o Lynx conhece, nenhum mostra 0x11 como um personagem não imprimível.
  • o conjunto de caracteres de exibição é configurável no Menu de opções .
  • O Lynx só usaria isso como um caractere imprimível devido a uma estranha combinação de configurações de localidade e conjunto de caracteres de exibição.

Na falta de alguns detalhes sobre o motivo pelo qual o Lynx pode estar usando o 0x11 como um caractere não imprimível, parece que o driver do terminal está enviando XON / XOFF com um buffer razoavelmente pequeno.

Seguindo os comentários (o terminal qual está usando TERM=ansi ? a captura de tela mostra xterm ), lynx pode escrever (usando curses) uma seta para a esquerda Por exemplo, o caractere ACS_LARROW . No código-fonte , tem esta aparência:

    /*
     * Draw the left scrolling-indicator now, to avoid the complication of
     * overwriting part of a multicolumn character which may lie in the first
     * position.
     */
    if (IsPanned && lft_cells) {
        CTRACE_EDIT((tfp, "Draw left scroll-indicator\n"));
        TmpStyleOn(prompting ? s_prompt_edit_arr : s_aedit_arr);
        LYmove(StartY, StartX);
        LYaddch(ACS_LARROW);
        TmpStyleOff(prompting ? s_prompt_edit_arr : s_aedit_arr);
        lft_shift = 1;
    }

Agora ... lynx sabe apenas sobre essa definição em <curses.h> :

#define ACS_LARROW      NCURSES_ACS(',') /* arrow pointing left */

enquanto a descrição do terminal para "ansi" fornece o mapeamento real em klone+acs :

acsc=+0\,1-0.^Y03'
    \,1
4a1f0g1h0j1k7l2m0n5o~p4q4r4s_t3u4v1w2x3y3z2{3|0}4~6,

Felizmente (para legibilidade), o mapeamento em que você está interessado é a segunda vírgula de mapeamento de entrada (com escape) para octal 021:

acsc=''aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,

e esse é o seu DC1 (021 octal é 0x11 hexadecimal). Mas esse mapeamento não é usado em xterm . Os caracteres de desenho de linha para xterm (a menos que esteja usando UTF-8, onde ncurses ignora a descrição do terminal) não incluem a seta para a esquerda. Esse mapeamento é definido em xterm-basic , que você pode ver sem vírgula (a vírgula no final é um separador):

   Terminal  database (terminfo (5) or termcap (5)) entries that work with
   xterm include

          an optional platform-specific entry ("xterm-new"),
          "xterm",
          "vt102",
          "vt100",
          "ansi" and
          "dumb"

O manual xterm sugere valores úteis para TERM e os "ansi "um (embora na lista) não é o primeiro. Já está lá há algum tempo (predating ncurses):

    /*
     * Draw the left scrolling-indicator now, to avoid the complication of
     * overwriting part of a multicolumn character which may lie in the first
     * position.
     */
    if (IsPanned && lft_cells) {
        CTRACE_EDIT((tfp, "Draw left scroll-indicator\n"));
        TmpStyleOn(prompting ? s_prompt_edit_arr : s_aedit_arr);
        LYmove(StartY, StartX);
        LYaddch(ACS_LARROW);
        TmpStyleOff(prompting ? s_prompt_edit_arr : s_aedit_arr);
        lft_shift = 1;
    }

Por exemplo, eu vejo isso em X11R5 (1993). Mas foi introduzido anterior , aparecendo em X10R4 (1986). Eu suspeito que o significado de "ansi" para emuladores de terminal mudou ligeiramente em 30 anos (corresponde a ANSI.SYS , que difere de xterm e assim por diante). Use "xterm" (ou "xterm-new" ), e você obterá melhores resultados.

    
por 30.01.2016 / 21:07
1

Encontrei uma página da web em que os caracteres de controle recebem uma representação imprimível que corresponde às suas descobertas:

link

 1         0x01     SOH start head             white smiley
 2         0x02     STX start text         ->| or black smiley
 3         0x03     ETX end text              |<- or heart
                                               _
 4         0x04     EOT end transmit           ^ or diamond
 5         0x05     ENQ enquiry              up arrow or club
 6         0x06     ACK acknowledge             ^ or spade
 7         0x07     BEL bell/beep               centre dot
 8         0x08     BS backspace           inverted text cursor
 9         0x09     HT horizontal tab           vert. oval
10         0x0A     LF line feed           |X> or inverted oval
11         0x0B     VT vertical tab         arrow or male symbol
12         0x0C     FF form feed           arrow or female symbol
13         0x0D     CR carriage return       single note symbol
14         0x0E     SO shift out              dual note symbol
15         0x0F     SI shift in                  sun symbol
16         0x10     DLE device link esc      down or right arrow
17         0x11     DC1 device control 1         left arrow
18         0x12     DC2 device control 2   tick or dual vert arrow
19         0x13     DC2 device control 3   diamond or dual exclamation
20         0x14     DC4 device control 4         pilcrow sign
21         0x15     NAK negative acknowl.       section symbol
22         0x16     SYN sync. idle              horizontal bar
23         0x17     ETB end trans. block    <X| or dual vert arrow underscored
24         0x18     CAN cancel                 left or up arrow
25         0x19     EM end medium              up or down arrow
26         0x1A     SUB substitute               right arrow
27         0x1B     ESC escape                   left arrow
28         0x1C     FS file separator              |____
29         0x1D     GS group separator       dual horizontal arrow
30         0x1E     RS record separator            up arrow
31         0x1F     US unit separator             down arrow
    
por 30.01.2016 / 22:07