Te sugerimos que revises esta respuesta en un entorno controlado antes de enviarlo a producción, un saludo.
Solución:
Es una combinación de cosas. El recomendado TERM
porque PuTTY es “masilla”, pero debido a la inercia, la mayoría de la gente usa “xterm”. El soporte de dibujo de líneas en la descripción del terminal xterm es diferente de las suposiciones de PuTTY porque xterm admite luit, que tiene algunas limitaciones con la forma en que se administra el conjunto de caracteres alternativos (consulte el informe de error de Debian # 254316: ncurses-base: solución para el manejo de pantalla de registrarse sgr0 no es del todo correcto).
Si utiliza infocmp
para comparar, puede ver estas líneas que tratan con el conjunto de caracteres alternativos:
acsc: '``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz~~', '``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz~~'.
enacs: NULL, 'E(BE)0'.
rmacs: 'E(B', '^O'.
smacs: 'E(0', '^N'.
Los VT100 pueden tener dos conjuntos de caracteres “designados”, denominados G0 y G1:
- El dibujo de líneas “xterm” funciona cambiando la designación de G0 entre los caracteres ASCII y los de dibujo de líneas,
- el dibujo de líneas “masilla” funciona mediante la designación de ASCII en G0 y el dibujo de líneas en G1 y cambiando entre los dos con los caracteres de control de cambio hacia adentro/cambio hacia afuera.
Aunque ambos son compatibles con VT100, el esquema xterm no funciona con PuTTY. Por el vínculo con luit
la descripción de terminal normal para xterm
no cambiará (a menos que sea posible modificar luit
para resolver el problema para sus usuarios), por lo que se necesita una solución para los usuarios de PuTTY:
-
use una descripción de terminal diferente según lo recomendado, por ejemplo,
TERM=putty
. El cuadro de diálogo de configuración de PuTTY le permite establecer variables de entorno para pasar a la máquina remota.Esto tiene el inconveniente de que algunos sistemas no tienen instalada la base de datos de terminal ncurses completa, debido al “tamaño” (es 6.8Mb en mi máquina local). También,
TERM
puede no estar en la lista de variables de entorno ssh permitidas. -
puede compilar su propia entrada terminfo con el tic de ncurses, por ejemplo,
cat >foo <<"EOF" xterm|my terminfo entry, enacs=E(BE)0, rmacs=^O, smacs=^N, use=xterm-new, EOF tic foo
-
usar la pantalla GNU. Hace sus propias correcciones y compensa los problemas de PuTTY.
Otras lecturas
- SCS – Seleccionar conjunto de caracteres (manual VT100)
- 4.4 Selección de juego de caracteres (SCS) (manual VT220)
- La base de datos terminfo es grande, ¿necesito todo eso? (preguntas frecuentes sobre ncurses)
- Putty: inicie sesión, ejecute el comando/cambie la variable de entorno y NO cierre la sesión
Quiero hacer algunas adiciones. Enfrenté el mismo problema: muchas herramientas basadas en ncurses como dialog
, menuconfig
y nconfig
de las fuentes de la perrera de Linux, incluso mc
se rompe cuando se construye con ncurses (aunque mc
está construido usando Slang en muchos sistemas operativos y no se ve afectado).
Esto es lo que pasó
usos de ncurses smacs
registro de terminfo para cambiar a "juego de caracteres alternativo" y luego usa acsc
para dibujar cajas. Envía a
que es un carácter de dibujo de caja en un juego de caracteres alternativo (ACS). Esta es la gráfica VT100.
Algunos emuladores de terminales hoy en día no son compatibles con ACS cuando están en UTF-8 porque las aplicaciones tienen la capacidad de enviar puntos de código de dibujo de cuadro reales.
Hay capacidad no oficial U8
(¡U mayúscula!) en terminfo
que le dice a ncurses: "En lugar de ACS, use puntos de código de dibujo de caja reales".
tengo esta capacidad infocmp -x xterm-utf
y para masilla también, pero no para xterm
.
Como puedes leer en ncurses(3)
(https://isla-invisible.net/ncurses/man/ncurses.3x.html), ncurses
es consciente de la consola de Linux y la pantalla de GNU (y tmux, que también usa screen
como TERM
) y siempre comportarse como si U8
fueron puestos.
Para otros terminales que no admiten ACS cuando están en UTF, puede configurar NCURSES_NO_UTF8_ACS
.
Desafortunadamente, ncurses no es consciente de PuTTY.
También hay luit
que puede convertir ACS en puntos Unicode.
Entonces, esto es lo que podemos hacer para ejecutar ncurses + putty en UTF-8:
-
Usar terminales con
U8#1
capacidad. Este está configurado para masilla (por cierto, sugiero usarputty-256color
en cambio). Puede crear su propia entrada conU8#1
ycolors#256
y compilarlo contic -x
. Tenga cuidado de que el mouse no funcione en terminales que no comiencen conxterm
(vermouseinterval(3)
, sección FALLOS). Por eso no usoputty
Terminal. sugiero copiarxterm-utf8
agregarcolors#256
compile y quédese con él: funciona perfectamente con putty, mouse y utf8. -
Puedes configurar
NCURSES_NO_UTF8_ACS
en tu perfil. -
Tu puedes correr
screen
otmux
: se estableceráTERM
parascreen
y arreglarncurses
-
Tu puedes correr
luit
: hará todas las conversiones por ti. -
Desde PuTTY 0.71, puede pedirle a PuTTY que admita dibujos ACS incluso en UTF-8.