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:
@@ -1798,11 +1798,28 @@ und zeigen stattdessen die rohen Buchstaben.
|
||||
Nachgemessen: bei `LC_ALL=C` schickt `whiptail` eine `ESC(0`-Umschaltung und
|
||||
**91 rohe `q`**; mit UTF-8-Locale keine einzige.
|
||||
|
||||
**Das Skript behebt das selbst.** Beim Start der Oberfläche setzt es
|
||||
**Das Skript behebt das auf zwei Wegen selbst.**
|
||||
|
||||
**1. UTF-8-Locale.** Beim Start der Oberfläche setzt es
|
||||
`LC_CTYPE` auf die erste verfügbare UTF-8-Locale (`C.UTF-8`, `en_US.UTF-8`, …).
|
||||
Nur `LC_CTYPE`, damit Sortierung und Zahlenformat unberührt bleiben. Ist
|
||||
`LC_ALL` auf einen Nicht-UTF-8-Wert gesetzt, wird es dabei entfernt – sonst
|
||||
würde es `LC_CTYPE` aushebeln. Prüfen lässt sich das mit:
|
||||
würde es `LC_CTYPE` aushebeln. **2. Unicode statt VT100.** Das allein genügt nicht: **ncurses benutzt die
|
||||
VT100-Umschaltung auch mit UTF-8-Locale**, solange das terminfo sie anbietet –
|
||||
bei `TERM=xterm` der Fall. Deshalb wird zusätzlich `NCURSES_NO_UTF8_ACS=1`
|
||||
gesetzt, womit ncurses echte Unicode-Rahmenzeichen zeichnet. Mit `dialog` unter
|
||||
`LANG=C.UTF-8` und `TERM=xterm` gemessen:
|
||||
|
||||
| | `ESC(0` | UTF-8-Rahmenbytes | rohe `q` |
|
||||
|---|---|---|---|
|
||||
| ohne Schalter | 38 | 0 | **182** |
|
||||
| **mit Schalter** | **0** | **220** | **0** |
|
||||
|
||||
`whiptail` braucht das nicht – es zeichnet bei UTF-8-Locale von sich aus
|
||||
Unicode. Wer den umgekehrten Fall hat – ein Terminal, das `ESC(0` beherrscht,
|
||||
aber kein UTF-8 – stellt mit `CMK_TUI_ACS=1` das alte Verhalten wieder her.
|
||||
|
||||
Prüfen lässt sich das mit:
|
||||
|
||||
```bash
|
||||
./scripts/cmk-manage.sh selftest # Abschnitt "Zeichensatz fuer die Oberflaeche"
|
||||
|
||||
Reference in New Issue
Block a user