terminal: exibindo caracteres especiais

11

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

insira a descrição da imagem aqui

Mas em outra máquina, eles são exibidos corretamente como linhas apropriadas:

insira a descrição da imagem aqui

Não tenho certeza se esse é um problema terminal ou se talvez seja necessário algum pacote.

Caso seja relevante: Meu sistema é o Debian Wheezy, meu intérprete é bashe meu emulador de terminal égnome-terminal

Martin Vegter
fonte
Você já tentou alterar a fonte usada pelo terminal?
Goldilocks
2
Essa seria uma solução possível se caracteres de espaço reservado como caixas ou pontos de interrogação estivessem no lugar dos caracteres Unicode, mas seu exemplo mostra a htopexibição de caracteres ASCII. No entanto, se a fonte padrão do terminal não for Unicode, é provável que a codificação também seja, então adicionei isso à minha resposta.
raehik

Respostas:

11

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 .UTF-8sufixo. Tente adicioná-lo:

export LANG=$LANG.UTF-8

Seu outro exemplo está sendo executado com um código de idioma UTF-8, que deve ser o padrão para shells recentes. Parece que htopdetecta seu código de idioma e exibe caracteres ASCII ou Unicode - então, na imagem inferior, você obtém caracteres Unicode legais, enquanto com o ASCII você obtém alguns caracteres bastante improvisados. Eu sugeriria mudar o local da máquina da imagem superior para uma Unicode (veja Localidade - 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. Mude a codificação padrão do seu emulador de terminal para UTF-8 ( xfce4-terminalencontrei-a na guia Avançado). Se você não puder, pode ser que sua fonte atual não seja compatível com Unicode: tente alterar sua fonte para uma Unicode.

[Estranhamente, descobri que depois de alterar meu código de idioma para ASCII uma vez em uma sessão de shell, htopsempre exibe os caracteres ASCII, mesmo depois de alterá-lo novamente. Esse pode ser o seu problema, se por algum motivo você estiver alterando seu local no shell ocasionalmente.]

raehik
fonte
3

O estranho é que htopusa ncurses, que podem desenhar linhas com / sem Unicode. No entanto, olhar o código-fonte CRT.cmostra 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 CRT_treeStrUtf8valor é

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 de maldições) possui símbolos portáteis para esses que não dependem se a codificação é UTF-8 ou não. Alguns aplicativos (como a opção da caixa de diálogo--ascii-lines ) fornecem uma opção para usar o desenho de linha ASCII, mas um aplicativo que nem tenta usar o desenho de linha fornecido nas ncurses não está fazendo uso efetivo da biblioteca.

Em suma, quando você se deparar com um programa que se comporta dessa maneira, deve relatá-lo como um bug aos desenvolvedores.

Leitura adicional:

Thomas Dickey
fonte
Embora não tenha resolvido diretamente o meu problema (configurar LANG/ LC_ALLativar os caracteres de desenho de linha Unicode esperados htop), isso é muito interessante. Obrigado por reservar um tempo para explicá-lo!
wrksprfct