terminal: exibindo caracteres especiais

11

Em alguns programas, como htop , as linhas e quadros não são exibidos corretamente. Em vez disso, eles são exibidos como - e / .

Masemoutramáquina,elessãoexibidoscorretamentecomolinhasadequadas:

Não tenho certeza se isso é um problema de terminal ou se talvez algum pacote seja necessário. Alguém pode por favor avisar?

Caso seja relevante: Meu sistema é Debian Wheezy, meu interpretador é bash e meu emulador de terminal é gnome-terminal

    
por Martin Vegter 26.10.2013 / 13:46

2 respostas

10

Seu exemplo principal está sendo executado com um código de idioma não-Unicode (ou seja, ASCII). Verifique sua variável de ambiente $ LANG (tente export | grep LANG ); você provavelmente não encontrará um sufixo .UTF-8 . Tente adicioná-lo:

export LANG=$LANG.UTF-8

Seu outro exemplo está sendo executado com uma localidade UTF-8, que deve ser o padrão para os shells recentes. Parece que htop detecta sua localidade e exibe caracteres ASCII ou Unicode - portanto, na figura abaixo, você obtém caracteres Unicode agradáveis, enquanto que com ASCII você obtém alguns caracteres bastante improvisados. Eu sugeriria mudar a localidade da máquina da imagem de cima para uma de Unicode (veja Locale - Debian Wiki ).

Se isso não funcionar, pode ser que o seu emulador de terminal seja o problema. A codificação padrão pode ser não-Unicode. Altere a codificação padrão do seu emulador de terminal para UTF-8 (em xfce4-terminal achei na guia Avançado). Se você não puder, pode ser que sua fonte atual não suporte Unicode: tente alterar sua fonte para uma fonte Unicode.

[Estranhamente, eu encontrei uma vez que eu mudei minha localidade para ASCII uma vez em uma sessão de shell, htop sempre exibe os caracteres ASCII, mesmo depois de alterá-lo de volta. Esse pode ser o seu problema, se por algum motivo você estiver alterando sua localidade em seu shell ocasionalmente.]

    
por 26.10.2013 / 15:23
2

O curioso é que htop usa ncurses, que podem desenhar linhas com / sem Unicode. No entanto, olhando para o código-fonte em CRT.c mostra a explicação:

#ifdef HAVE_LIBNCURSESW
   if(strcmp(nl_langinfo(CODESET), "UTF-8") == 0)
      CRT_utf8 = true;
   else
      CRT_utf8 = false;
#endif

   CRT_treeStr =
#ifdef HAVE_LIBNCURSESW
      CRT_utf8 ? CRT_treeStrUtf8 :
#endif
      CRT_treeStrAscii;

e o valor CRT_treeStrUtf8 é

const char *CRT_treeStrUtf8[TREE_STR_COUNT] = {
   "\xe2\x94\x80", // TREE_STR_HORZ ─
   "\xe2\x94\x82", // TREE_STR_VERT │
   "\xe2\x94\x9c", // TREE_STR_RTEE ├
   "\xe2\x94\x94", // TREE_STR_BEND └
   "\xe2\x94\x8c", // TREE_STR_TEND ┌
   "+",            // TREE_STR_OPEN +
   "\xe2\x94\x80", // TREE_STR_SHUT ─
};

No entanto, ncurses (qualquer implementação curses) possui símbolos portáveis para estes que não dependem se a codificação é UTF-8 ou não. Alguns aplicativos (como diálogo --ascii-lines option) fornecem uma opção para usar o desenho de linha ASCII, mas um aplicativo que nem sequer tenta usar o desenho de linha fornecido nas ncurses não está fazendo uso efetivo da biblioteca.

Em suma, quando você se depara com um programa que se comporta assim, você deve denunciá-lo como um bug para os desenvolvedores.

Leitura adicional:

  • Gráficos de linha (página de manual do ncurses addch )
  • border , wborder , box , hline , whline , vline , wvline , mvhline , mvwhline , mvvline , mvwvline - criar maldições bordas, linhas horizontais e verticais
  • dialog capturas de tela ( nenhuma requer codificação UTF-8 para usar o desenho de linhas
por 17.04.2016 / 00:27