Rahmen in PuTTY: UTF-8-Locale fuer die Oberflaeche erzwingen

Gemeldet mit Bildschirmfoto: statt Rahmen erscheinen q, x, l und m.
Ursache nachgemessen - ohne UTF-8-Locale zeichnen dialog und whiptail
die Rahmen ueber die alte VT100-Umschaltung ESC(0, die Terminals im
UTF-8-Modus (PuTTY in der Vorgabe) ignorieren:

    LC_ALL=C        ESC(0-Umschaltungen: 1   rohe q: 91
    LC_CTYPE=C.UTF-8  ESC(0-Umschaltungen: 0   rohe q: 0

ui_init setzt jetzt beim Start der Oberflaeche LC_CTYPE auf die erste
verfuegbare UTF-8-Locale. Bewusst nur LC_CTYPE, damit Sortierung und
Zahlenformat unberuehrt bleiben. Dabei war ein zweiter Anlauf noetig:
ein gesetztes LC_ALL sticht jede einzelne Kategorie aus, der erste
Versuch blieb deshalb wirkungslos. Steht LC_ALL auf einem
Nicht-UTF-8-Wert, wird es entfernt.

Gemessen ueber unsere eigene ui_menu unter LC_ALL=C: vorher 91 rohe q,
danach 0.

Gibt es gar keine UTF-8-Locale, faellt die Oberflaeche auf einfache
Rahmen zurueck (dialog --ascii-lines, sofern unterstuetzt); erzwingen
laesst sich das mit CMK_TUI_ASCII=1. Der Selbsttest hat dafuer einen
eigenen Abschnitt, der die Locale vorher und nachher zeigt und im
Zweifel das fehlende Sprachpaket nennt.

Dokumentiert als Abschnitt 14.4 in beiden Sprachfassungen, samt der
vier PuTTY-Einstellungen fuer die Gegenseite.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-20 18:20:47 +02:00
co-authored by Claude Opus 5
parent 9d8a9ecf71
commit 667c119a6c
4 changed files with 186 additions and 7 deletions
+14 -1
View File
@@ -4750,7 +4750,20 @@ cmd_selftest() {
printf ' "set -e" das Skript. Besser als if-Block schreiben.\n'
fi
printf '\n%s5. Einstellungstabelle%s\n' "$C_BLD" "$C_RST"
printf '\n%s5. Zeichensatz fuer die Oberflaeche%s\n' "$C_BLD" "$C_RST"
local before="${LC_ALL:-${LC_CTYPE:-${LANG:-<leer>}}}"
ui_fix_locale || true
printf ' Locale vorher : %s\n' "$before"
printf ' Locale jetzt : %s\n' "${LC_CTYPE:-${LANG:-<leer>}}"
if [ -n "${UI_ASCII:-}" ]; then
printf ' %s[ WARN ]%s Keine UTF-8-Locale vorhanden - die Rahmen werden einfach gezeichnet.\n' "$C_YEL" "$C_RST"
printf ' Abhilfe: dnf install -y glibc-langpack-en bzw. locale-gen\n'
else
printf ' %s[ OK ]%s UTF-8 - die Rahmen werden sauber gezeichnet%s\n' "$C_GRN" "$C_RST" \
"$([ -n "${UI_LOCALE_NOTE:-}" ] && echo " (${UI_LOCALE_NOTE})")"
fi
printf '\n%s6. Einstellungstabelle%s\n' "$C_BLD" "$C_RST"
n="$(settings_defs | awk -F'|' 'NF!=6' | wc -l)"
if [ "$n" -eq 0 ]; then
printf ' %s[ OK ]%s alle Zeilen haben sechs Felder\n' "$C_GRN" "$C_RST"
+54 -4
View File
@@ -297,7 +297,57 @@ ui_calc_text() { # text zusatzzeilen
return 0
}
# ---------------------------------------------------------------------
# Rahmenzeichen in PuTTY & Co.
#
# Ohne UTF-8-Locale zeichnen dialog/whiptail die Rahmen ueber die alte
# VT100-Umschaltung "ESC(0". Terminals, die im UTF-8-Modus laufen -
# PuTTY in der Vorgabe -, ignorieren diese Umschaltung und zeigen
# stattdessen die rohen Buchstaben q, x, l, m.
#
# 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.
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 ;;
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
if locale -a 2>/dev/null | grep -qix "$l"; then
# LC_ALL sticht jede einzelne Kategorie aus - solange es auf
# einem Nicht-UTF-8-Wert steht, bliebe LC_CTYPE wirkungslos.
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)"
return 0
fi
done
# Keine UTF-8-Locale vorhanden - dann bleibt nur ASCII
UI_ASCII=1
UI_LOCALE_NOTE="keine UTF-8-Locale gefunden - einfache Rahmen"
return 1
}
# Zusaetzliche Argumente, wenn nur ASCII-Rahmen moeglich sind
ui_ascii_args() {
UI_EXTRA=()
case "${CMK_TUI_ASCII:-}${UI_ASCII:-}" in
'') return 0 ;;
esac
# Nur dialog kann das; whiptail kennt die Option nicht.
if [ "${UI_BIN:-}" = dialog ] && dialog --ascii-lines --print-version >/dev/null 2>&1; then
UI_EXTRA=(--ascii-lines)
fi
return 0
}
ui_init() {
ui_fix_locale || true
ui_ascii_args
# Geometrie IMMER setzen - sonst laeuft das Skript unter "set -u" auf
# eine unbound variable, wenn UI_BIN von aussen vorgegeben wurde.
UI_H="${UI_H:-22}"; UI_W="${UI_W:-78}"; UI_MH="${UI_MH:-13}"
@@ -335,7 +385,7 @@ _ui_list() {
ui_init
local widget="$1" title="$2" text="$3" per="$4"; shift 4
ui_calc "$text" "$per" "$@"
"$UI_BIN" --backtitle "$UI_BACKTITLE" --title "$title" \
"$UI_BIN" ${UI_EXTRA[@]+"${UI_EXTRA[@]}"} --backtitle "$UI_BACKTITLE" --title "$title" \
"$widget" "$text" "$UI_H" "$UI_W" "$UI_MH" "$@" 3>&1 1>&2 2>&3
}
@@ -347,10 +397,10 @@ _ui_box() {
ui_calc_text "$text" "$extra"
case "$widget" in
--inputbox|--passwordbox)
"$UI_BIN" --backtitle "$UI_BACKTITLE" --title "$title" \
"$UI_BIN" ${UI_EXTRA[@]+"${UI_EXTRA[@]}"} --backtitle "$UI_BACKTITLE" --title "$title" \
"$widget" "$text" "$UI_H" "$UI_W" "$@" 3>&1 1>&2 2>&3 ;;
*)
"$UI_BIN" --backtitle "$UI_BACKTITLE" --title "$title" \
"$UI_BIN" ${UI_EXTRA[@]+"${UI_EXTRA[@]}"} --backtitle "$UI_BACKTITLE" --title "$title" \
"$widget" "$text" "$UI_H" "$UI_W" "$@" ;;
esac
}
@@ -359,7 +409,7 @@ _ui_box() {
_ui_file() {
ui_init
ui_term_size
"$UI_BIN" --backtitle "$UI_BACKTITLE" --title "$1" \
"$UI_BIN" ${UI_EXTRA[@]+"${UI_EXTRA[@]}"} --backtitle "$UI_BACKTITLE" --title "$1" \
--textbox "$2" $(( UI_ROWS - 2 )) $(( UI_COLS - 4 ))
}