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:
+23
-1
@@ -308,12 +308,33 @@ ui_calc_text() { # text zusatzzeilen
|
||||
# Nachgemessen: bei LC_ALL=C schickt whiptail eine ESC(0-Umschaltung und
|
||||
# 91 rohe "q"; mit UTF-8-Locale keine einzige. Es genuegt, LC_CTYPE zu
|
||||
# setzen - Sortierung und Zahlenformat bleiben damit unberuehrt.
|
||||
# Zwingt ncurses zu echten Unicode-Rahmenzeichen.
|
||||
#
|
||||
# Auch mit UTF-8-Locale benutzt ncurses die VT100-Umschaltung ESC(0,
|
||||
# solange das terminfo sie anbietet (bei TERM=xterm der Fall). Terminals
|
||||
# im UTF-8-Modus - PuTTY - machen die nicht mit und zeigen q, x, l, m.
|
||||
# Gemessen mit dialog unter LANG=C.UTF-8, TERM=xterm:
|
||||
# ohne Schalter : 38 ESC(0, 0 Rahmenbytes, 182 rohe q
|
||||
# mit Schalter : 0 ESC(0, 220 Rahmenbytes, 0 rohe q
|
||||
# whiptail (slang) braucht ihn nicht, es zeichnet bei UTF-8-Locale schon
|
||||
# von sich aus Unicode.
|
||||
ui_use_unicode_acs() {
|
||||
# CMK_TUI_ACS=1 erzwingt umgekehrt das alte Verhalten - fuer
|
||||
# Terminals, die ESC(0 koennen, aber kein UTF-8.
|
||||
if [ -n "${CMK_TUI_ACS:-}" ]; then
|
||||
unset NCURSES_NO_UTF8_ACS 2>/dev/null || true
|
||||
return 0
|
||||
fi
|
||||
export NCURSES_NO_UTF8_ACS=1
|
||||
return 0
|
||||
}
|
||||
|
||||
ui_fix_locale() {
|
||||
[ -n "${UI_LOCALE_DONE:-}" ] && return 0
|
||||
UI_LOCALE_DONE=1
|
||||
UI_LOCALE_NOTE=""
|
||||
case "${LC_ALL:-${LC_CTYPE:-${LANG:-}}}" in
|
||||
*UTF-8*|*utf-8*|*UTF8*|*utf8*) return 0 ;;
|
||||
*UTF-8*|*utf-8*|*UTF8*|*utf8*) ui_use_unicode_acs; return 0 ;;
|
||||
esac
|
||||
local l
|
||||
for l in C.UTF-8 C.utf8 en_US.UTF-8 en_US.utf8 de_DE.UTF-8 de_DE.utf8; do
|
||||
@@ -323,6 +344,7 @@ ui_fix_locale() {
|
||||
if [ -n "${LC_ALL:-}" ]; then unset LC_ALL; fi
|
||||
export LC_CTYPE="$l"
|
||||
UI_LOCALE_NOTE="LC_CTYPE auf $l gesetzt (war nicht UTF-8)"
|
||||
ui_use_unicode_acs
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
|
||||
Reference in New Issue
Block a user