terminal: muestra caracteres especiales

11

En algunos programas, como htoplas líneas y los marcos, no se muestran correctamente. En cambio, se muestran como -y /.

ingrese la descripción de la imagen aquí

Pero en otra máquina, se muestran correctamente como líneas adecuadas:

ingrese la descripción de la imagen aquí

No estoy seguro de si se trata de un problema terminal, o si quizás algún paquete es necesario.

En caso de que sea relevante: mi sistema es Debian Wheezy, mi intérprete es bashy mi emulador de terminal esgnome-terminal

Martin Vegter
fuente
¿Has intentado cambiar la fuente utilizada por el terminal?
Ricitos de oro
2
Esa sería una posible solución si los caracteres de marcador de posición como cuadros o signos de interrogación estuvieran en lugar de los caracteres Unicode, pero su ejemplo muestra la htopvisualización de caracteres ASCII. Sin embargo, si la fuente de terminal predeterminada no es Unicode, entonces la codificación también es probable, así que he agregado eso a mi respuesta.
raehik

Respuestas:

11

Su ejemplo principal se ejecuta con una configuración regional no Unicode (es decir, ASCII). Verifique su variable de entorno $ LANG (pruebe export | grep LANG); lo más probable es que no encuentres un .UTF-8sufijo. Intenta agregarlo:

export LANG=$LANG.UTF-8

Su otro ejemplo se ejecuta con un entorno local UTF-8, que debería ser el predeterminado para los shells recientes. Parece que htopdetecta su configuración regional y muestra caracteres ASCII o Unicode, por lo que en la imagen inferior, obtienes buenos caracteres Unicode, mientras que con ASCII obtienes algunos bastante improvisados. Sugeriría cambiar la configuración regional de la máquina de la imagen superior a una Unicode (consulte Configuración regional - Wiki de Debian ).

Si eso no funciona, puede ser que su emulador de terminal sea ​​el problema. La codificación predeterminada podría ser no Unicode. Cambie la codificación predeterminada de su emulador de terminal a UTF-8 ( xfce4-terminallo encontré en la pestaña Avanzado). Si no puede, es posible que su fuente actual no sea compatible con Unicode: intente cambiar su fuente a una Unicode.

[Curiosamente, descubrí que una vez que había cambiado mi configuración regional a ASCII una vez en una sesión de shell, htopsiempre muestra los caracteres ASCII, incluso después de volver a cambiarlo. Ese podría ser su problema, si por alguna razón está cambiando su configuración regional en su shell ocasionalmente.]

raehik
fuente
3

Lo extraño es que htopusa ncurses, que puede dibujar líneas con / sin Unicode. Sin embargo, mirar el código fuente en CRT.cmuestra la explicación:

#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;

y el CRT_treeStrUtf8valor es

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 ─
};

Sin embargo, ncurses (cualquier implementación de maldiciones) tiene símbolos portátiles para estos que no dependen de si la codificación es UTF-8 o no. Algunas aplicaciones (como la opción de diálogo--ascii-lines ) ofrecen una opción para usar el dibujo lineal ASCII, pero una aplicación que ni siquiera intenta usar el dibujo lineal proporcionado en ncurses no está haciendo un uso efectivo de la biblioteca.

En resumen, cuando se encuentra con un programa que se comporta así, debe informarlo como un error a los desarrolladores.

Otras lecturas:

Thomas Dickey
fuente
Si bien no resolvió directamente mi problema (establecer LANG/ LC_ALLhabilitar los caracteres de dibujo de línea Unicode esperados htop), esto es muy interesante. ¡Gracias por tomarte el tiempo de explicarlo!
wrksprfct