NCURSES_NO_UTF8_ACS: ncurses zu Unicode-Rahmen zwingen

Die Diagnose auf dem betroffenen Terminal war eindeutig: Zeile A (echte
UTF-8-Rahmenzeichen) zeichnete Linien, Zeile B (VT100-Umschaltung ESC(0)
nicht. Locale war bereits C.UTF-8, dialog war installiert - und die
Oberflaeche sah trotzdem falsch aus.

Grund: ncurses benutzt die VT100-Umschaltung AUCH mit UTF-8-Locale,
solange das terminfo sie anbietet - bei TERM=xterm der Fall. Die
Locale-Korrektur allein reichte deshalb nicht, und der Wechsel von
whiptail zu dialog machte es sogar schlechter, weil whiptail (slang)
bei UTF-8-Locale von sich aus Unicode zeichnet, ncurses aber nicht.

Abhilfe ist NCURSES_NO_UTF8_ACS=1. Mit dialog unter LANG=C.UTF-8 und
TERM=xterm gemessen:
    ohne Schalter :  38 ESC(0,   0 Rahmenbytes, 182 rohe q
    mit  Schalter :   0 ESC(0, 220 Rahmenbytes,   0 rohe q

ui_init setzt den Schalter jetzt, sobald eine UTF-8-Locale gilt.
CMK_TUI_ACS=1 stellt das alte Verhalten wieder her - fuer Terminals, die
ESC(0 beherrschen, aber kein UTF-8.

tui-check zeigt den Stand des Schalters an und erklaert bei "A Linien,
B Buchstaben" jetzt, dass genau dieser Fall abgefangen wird und die
Oberflaeche trotzdem sauber aussehen muss.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-20 18:38:54 +02:00
co-authored by Claude Opus 5
parent 861a9bd71c
commit a8fbc3f557
4 changed files with 70 additions and 7 deletions
+9 -2
View File
@@ -4692,6 +4692,8 @@ cmd_tui_check() {
printf ' LC_CTYPE : %s\n' "${LC_CTYPE:-<leer>}"
printf ' Zeichensatz : %s\n' "$(locale charmap 2>/dev/null || echo unbekannt)"
printf ' Programm : %s\n' "${UI_BIN:-keines (dialog/whiptail fehlt)}"
printf ' Unicode-ACS : %s\n' \
"$([ -n "${NCURSES_NO_UTF8_ACS:-}" ] && echo 'ein (ncurses zeichnet Unicode)' || echo 'aus (ncurses nutzt ESC(0)')"
[ -n "${UI_LOCALE_NOTE:-}" ] && printf ' Angepasst : %s\n' "$UI_LOCALE_NOTE"
printf '\n%sZeile A - echte UTF-8-Rahmenzeichen%s\n' "$C_BLD" "$C_RST"
@@ -4711,8 +4713,13 @@ ${C_BLD}Auswertung${C_RST}
Alles in Ordnung - die Oberflaeche muss sauber aussehen.
A zeigt Linien, B zeigt lqqqk / x / mqqj
Das Terminal macht die VT100-Umschaltung nicht mit.
Genau das ist der PuTTY-Fall. Abhilfe in PuTTY:
Das Terminal macht die VT100-Umschaltung nicht mit - der
PuTTY-Fall. Das Skript faengt das ab: es setzt
NCURSES_NO_UTF8_ACS=1, womit ncurses (und damit dialog)
dieselben Zeichen wie in Zeile A verwendet. Die Oberflaeche
muss dadurch sauber aussehen, obwohl Zeile B es nicht tut.
Sieht sie trotzdem falsch aus, hilft in PuTTY:
Window -> Translation -> Remote character set: UTF-8
Window -> Translation -> Handling of line drawing characters:
"Use Unicode line drawing code points"