Ermitteln Sie, wie viel Unicode mein Terminal unterstützt, auch über den Bildschirm

10

Hier ist das Problem: Ich möchte erkennen können, ob mein Terminal in der Lage ist, anständigen Unicode zu verwenden oder nicht, um einige Zeichen zu verwenden oder nicht, ähnlich wie bei Blicken, die manchmal Farben verwenden und andere unterstreichen.

Die Motivation entsteht, weil ich in jeder Art von virtuellem Terminal anständige Schriftarten bekomme, aber ich verstehe, dass die grundlegende Linux-Konsole einen Zeichensatz von 256 oder 512 gleichzeitigen Symbolen hat, sodass Sie keine vollständige Schriftartenunterstützung erwarten können.

Zuerst dachte ich, ich könnte $TERModer tty verwenden, aber hier ist der Haken: Ich verwende auch byobu, also $TERMimmer "screen.linux". Die Ausgabe von tty ist auch nicht sehr aussagekräftig: /dev/pts/<some number>sowohl in "realer" als auch in virtueller Hinsicht.

$BYOBU_TTYist auch keine Hilfe, weil es zB sein kann /dev/tty1und wenn die Sitzung in Ctrl+ Alt+ geöffnet wird, werden F1die Zeichen nicht angezeigt, aber wenn sie von einem X-Begriff an dieselbe Sitzung angehängt werden, werden sie richtig angezeigt und $BYOBU_TTYändern sich immer noch nicht. Außerdem möchte ich dies erkennen können, ohne anzunehmen, dass Byobu vorhanden ist oder nicht.

Außerdem zeigt das Gebietsschema in allen Fällen en_US.UTF-8 an

Trotzdem verwendet ein Blick (um ein bestimmtes Tool zu nennen, das dies erkennt), selbst innerhalb von Byobu, unterschiedliche Ausgaben, je nachdem, welches Terminal ich an die Byobu-Sitzung anschließe.

Ich habe Probleme mit Google, weil Terminal und tty zu häufig vorkommen. Ich komme höchstens zu empfohlenen $TERModer tty- Lösungen .

Alex
quelle

Antworten:

6

Nun, zuerst möchte ich darauf hinweisen, dass heutzutage so ziemlich alle Terminals "virtuell" sind in dem Sinne, von dem Sie sprechen ... selbst wenn sich das Terminal am anderen Ende einer echten seriellen Schnittstelle befindet. Ich meine, die Zeiten von VT-100 , Wyse- Terminals und anderen "physischen", "echten" Terminals sind so gut wie vorbei!

Angenommen, Sie möchten feststellen, welche Art von Unicode-Unterstützung Ihr Terminal bietet. Sie können dies tun, indem Sie Testzeichen an is schreiben und sehen, was passiert. (Sie können sich bemühen, die Testzeichen zu löschen, nachdem Sie sie dann geschrieben haben, aber der Benutzer sieht sie möglicherweise immer noch kurz, oder das Löschen funktioniert möglicherweise überhaupt nicht richtig.)

Die Idee ist, das Terminal zu bitten, Ihnen seine Cursorposition mitzuteilen, ein Testzeichen auszugeben, das Terminal erneut aufzufordern, Ihnen seine Position mitzuteilen, und die beiden Positionen zu vergleichen, um zu sehen, wie weit sich der Cursor des Terminals bewegt hat.

Um das Terminal nach seiner Position zu fragen, siehe hier . Im Wesentlichen:

echo -e "\033[6n"; read -d R foo; echo -en "\nCurrent position: "; echo $foo | cut -d \[ -f 2

Versuchen Sie, "é" auszugeben. Dieses Zeichen benötigt in UTF-8 2 Byte, wird jedoch nur in einer Spalte auf dem Bildschirm angezeigt. Wenn Sie feststellen, dass die Ausgabe von "é" dazu führt, dass sich der Cursor um 2 Positionen bewegt, hat das Terminal überhaupt keine UTF-8-Unterstützung und hat wahrscheinlich eine Art Müll ausgegeben. Wenn sich der Cursor überhaupt nicht bewegt hat, ist das Terminal wahrscheinlich nur ASCII. Wenn es sich um 1 Position bewegt hat, dann Glückwunsch, kann es wahrscheinlich französische Wörter anzeigen.

Versuchen Sie, "あ" auszugeben. Dieses Zeichen benötigt in UTF-8 3 Byte, wird jedoch nur in zwei Spalten auf dem Bildschirm angezeigt. Wenn sich der Cursor um 0 oder 3 bewegt, sind schlechte Nachrichten ähnlich wie oben. Wenn es um 1 verschoben wird, unterstützt das Terminal anscheinend UTF-8, kennt jedoch keine breiten Zeichen (in Schriftarten mit fester Breite). Wenn es sich um 2 Spalten bewegt, ist alles gut.

Ich bin sicher, dass Sie andere Prüfzeichen ausgeben können, die zu nützlichen Informationen führen würden. Mir ist kein Tool bekannt, das dies automatisch ausführt.

Celada
quelle
1
Danke für den Vorschlag, Celada. Es funktioniert jedoch nicht: Ich sehe die gemeldeten Positionen korrekt (1 für é, 2 für あ). Der einzige Unterschied ist, dass ich in XI die realen Zeichen sehe, während ich in tty1 einen Diamanten sehe. Ich denke, das Terminal unterstützt utf-8 wirklich, aber es fehlt das Zeichen in der verwendeten Schriftart.
Álex
Ich habe jetzt den Befehl showonsolefont gesehen. Dies schien eine mögliche Lösung zu sein (mit -v wird angegeben, dass es sich bei der Schriftart um eine Schriftart mit 512 Zeichen handelt). Leider funktioniert es nur, wenn Byobu nicht verwendet wird. In diesem letzten Fall ist der Fehler "Es konnte kein Dateideskriptor für die Konsole abgerufen werden" angezeigt. Wenn ich die tty (-C Option) explizit übergebe, wird der Fehler "Konnte / dev / pts / 37 nicht öffnen"
Álex
Übrigens: sh-Skript zur Bestimmung der Terminalbreite eines Strings (aber darum geht es in dieser Frage nicht )
Gilles 'SO - hör auf böse
3

OP tatsächliche Frage lautet: Was Unicode - Werte hat die Linux - Konsole Unterstützung, und können solche erkannt werden während des Laufens screen. Im Prinzip kann man dies tun, indem man die Unicode-Zuordnung für die Konsole abruft.

Der kbdQuellbaum enthält getunimap(und seine Handbuchseite). Die Handbuchseite sagt das

Das getunimap-Programm ist alt und veraltet. Es ist jetzt Teil von setfont

das ist nicht genau wahr. setfonthat eine Option, die ungefähr das Gleiche tut:

   -ou file                                  
          Save previous Unicode map in file

Die Unterschiede:

  • setfontschreibt in eine Datei, während getunimapin die Standardausgabe geschrieben wird
  • getunimap zeigt das Zeichen, das zugeordnet werden würde, als Kommentar.

Zum Beispiel:

0x0c4   U+2500  # ─ 
0x0c4   U+2501  # ━ 
0x0b3   U+2502  # │ 
0x0b3   U+2503  # ┃ 
0x0da   U+250c  # ┌ 
0x0da   U+250d  # ┍ 
0x0da   U+250e  # ┎ 
0x0da   U+250f  # ┏ 
0x0bf   U+2510  # ┐ 
0x0bf   U+2511  # ┑ 
0x0bf   U+2512  # ┒ 
0x0bf   U+2513  # ┓ 
0x0c0   U+2514  # └ 
0x0c0   U+2515  # ┕ 
0x0c0   U+2516  # ┖ 
0x0c0   U+2517  # ┗ 

gegen

0xc4    U+2500
0xc4    U+2501
0xb3    U+2502
0xb3    U+2503
0xda    U+250c
0xda    U+250d
0xda    U+250e
0xda    U+250f
0xbf    U+2510
0xbf    U+2511
0xbf    U+2512
0xbf    U+2513
0xc0    U+2514
0xc0    U+2515
0xc0    U+2516
0xc0    U+2517

Wenn Sie ausgeführt werden screen(oder beispielsweise ausgeführt werden xtermund nicht auf der Konsole), wird ein Berechtigungsfehler angezeigt, den Sie umgehen können sudo.

Wenn ich zufällig weiß, welche Schriftart geladen wurde, kann ich dies (ohne besondere Berechtigungen) überprüfen, indem ich psfgettablez.

zcat /usr/share/consolefonts/Lat2-Fixed16.psf.gz | psfgettable -

und sehen Sie sich die Zuordnungsdaten an, die setfontzum Laden der Schriftart verwendet werden (mit der Unicode-Zuordnung):

#
# Character table extracted from font -
#
0x000   U+00a9
0x001   U+00ae
0x002   U+00dd
0x003   U+0104
0x004   U+2666 U+25c8 U+fffd
0x005   U+0105
0x006   U+0111
0x007   U+0150
0x008   U+0151
0x009   U+0162
0x00a   U+0164
0x00b   U+0170
0x00c   U+0171
0x00d   U+021a 
0x00e   U+02dd  
0x00f   U+2014 U+2015
0x010   U+2020
0x011   U+2021
0x012   U+2022 U+25cf
...

Beide getunimapund setfontgeben die Daten unsortiert an, während psfgettablesie sortiert zu sein scheinen (sowie das Kombinieren von Linien für Unicode-Werte, die demselben Glyphen zugeordnet sind). Es gibt also Unterschiede, aber die Informationen sind zugänglich.

Lesen Sie weiter (um zu veranschaulichen, warum Sie showconsolefontdieses Problem nicht lösen können):

Thomas Dickey
quelle
Danke, Thomas, dass du meine ursprüngliche Frage geklärt und mich auf den richtigen Weg gebracht hast. Ich werde versuchen, aus Ihren Informationen einen einfachen Einzeiler zu erhalten und mit den Ergebnissen zurückzukommen. Die Verwendung sudoist für meinen Anwendungsfall kein Hindernis.
Álex
Das ist merkwürdig: setfontGibt nichts in virtuellen Terminals aus (erstellt weder die angegebene Datei noch gibt es einen Fehler aus), sondern funktioniert erwartungsgemäß in tatsächlichen Terminals. Dies ist in Ubuntu 16.04
Álex
2

Ich bin auf diese Frage gestoßen, als ich versucht habe, dasselbe zu erreichen, wollte aber nichts auf dem Bildschirm belassen und eine Variable festlegen lassen. Deshalb habe ich Folgendes in ein Shell-Skript eingefügt, das ich als Quelle verwende:

function test_unicode {
  echo -ne "\xe2\x88\xb4\033[6n\033[1K\r"
  read -d R foo
  echo -ne "\033[1K\r"
  echo -e "${foo}" | cut -d \[ -f 2 | cut -d";" -f 2 | (
    read UNICODE
    [ $UNICODE -eq 2 ] && return 0
    [ $UNICODE -ne 2 ] && return 1
  )
}

test_unicode
RC=$?
export UNICODE_SUPPORT=`[ $RC -eq 0 ] && echo "Y" || echo "N"`
unset test_unicode
Jeff
quelle
1
Danke für den Beitrag, Jeff. Leider bekomme ich auch in der Basiskonsole immer Y: S
Álex