Détecte la quantité d'Unicode que mon terminal prend en charge, même à travers l'écran

Voici le problème: je veux être capable de discerner si mon terminal est capable d'unicode décent ou non, afin d'utiliser certains caractères ou non, tout comme les regards, qui utilise parfois des colors et d'autres soulignent.

La motivation provient du fait que dans n'importe quel type de terminal virtuel, je reçois des fonts correctes, mais je comprends que la console Linux de base possède un jeu de caractères de 256 ou 512 symboles simultanés.

Au début, j'ai pensé que je pourrais utiliser $TERM ou tty, mais voici le hic: j'utilise aussi byobu, donc $TERM est toujours "screen.linux". La sortie de tty n'est pas très révélasortingce: /dev/pts/<some number> à la fois "réel" et virtuel.

$BYOBU_TTY ne sert à rien non plus car, par exemple, il peut s'agir de /dev/tty1 et lorsque la session est ouverte dans Ctrl + Alt + F1, les caractères ne s'affichent pas correctement encore $BYOBU_TTY ne change pas. En outre, je voudrais être capable de détecter cela sans présumer que byobu est là ou pas.

En outre, les parameters régionaux s'affichent dans tous les cas en_US.UTF-8

Pourtant, certains regards (pour nommer un outil particulier, je vois détecter cela), même à l'intérieur de byobu, utilise une sortie différente en fonction du terminal que j'attache à la session byobu.

J'ai des problèmes avec google car le terminal et le tty semblent des termes de search trop communs. Tout au plus j'arrive à des solutions recommandant $TERM ou tty.

Eh bien, tout d'abord, je dirais que presque tous les terminaux de nos jours sont «virtuels» dans le sens que vous parlez … même si le terminal est à l'autre extrémité d'un port sériel de bonne foi. Je veux dire, les jours de VT-100 s, les terminaux Wyse et d'autres terminaux «physiques», «réels» sont à peu près partis!

Cela mis à part, disons que vous voulez détecter quel type de support Unicode votre terminal a. Vous pouvez le faire en écrivant des caractères de test sur est et en voyant ce qui se passe. (Vous pouvez faire un effort pour effacer les caractères de test après l'avoir écrit, mais l'user peut les voir brièvement ou les effacer peut ne pas fonctionner correctement.)

L'idée est de requestr au terminal de vous indiquer la position du slider, de sortir un caractère de test, de requestr à nouveau au terminal de vous indiquer sa position et de comparer les deux positions pour voir jusqu'où le slider du terminal s'est déplacé.

Pour requestr la position du terminal, voir ici . Essentiellement:

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

Essayez de sortir "é". Ce caractère prend 2 octets en UTF-8 mais ne s'affiche que dans une seule colonne de l'écran. Si vous détectez que la sortie de "é" provoque le déplacement du slider sur 2 positions, le terminal n'a pas du tout de support UTF-8 et a probablement sorti une sorte d'ordure. Si le slider ne bouge pas du tout, alors le terminal est probablement ASCII seulement. S'il a bougé d'une position, alors félicitations, il peut probablement afficher des mots français.

Essayez de sortir "あ". Ce caractère prend 3 octets en UTF-8 mais ne s'affiche que dans deux colonnes à l'écran. Si le slider se déplace de 0 ou 3, de mauvaises nouvelles, similaires à ci-dessus. S'il se déplace de 1, il semble que le terminal supporte UTF-8, mais ne connaît pas les caractères larges (dans les fonts de largeur fixe). S'il se déplace de 2 colonnes, tout va bien.

Je suis sûr qu'il y a d'autres caractères de sonde que vous pourriez émettre qui conduiraient à des informations utiles. Je ne suis pas au courant d'un outil qui le fait automatiquement.

La véritable question de l'OP est la suivante: quelles sont les valeurs Unicode supscopes par la console Linux et celles-ci peuvent-elles être détectées lors de l'exécution de l' screen . En principe, on peut le faire en récupérant la carte Unicode pour la console.

L'tree source de kbd contient getunimap (et sa page de manuel). La page de manuel dit que

Le programme getunimap est ancien et obsolète. Il fait maintenant partie de setfont

ce qui n'est pas tout à fait vrai. setfont a une option qui fait à peu près la même chose:

  -ou file Save previous Unicode map in file 

Les différences:

  • setfont écrit dans un file, alors que getunimap écrit sur la sortie standard
  • getunimap montre le caractère qui serait mappé, en tant que commentaire.

Par exemple:

 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 # ┗ 

contre

 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 

Si vous exécutez dans l' screen (ou par exemple en exécutant xterm et pas sur la console), vous obtiendrez une erreur de permissions que vous pouvez contourner en utilisant sudo .

Si je sais quelle police a été chargée, je peux vérifier cela (sans permissions spéciales) en utilisant psfgettable , par exemple,

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

et voir datatables de mappage que setfont utilisera pour charger la police (avec le mappage Unicode):

 # # 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 ... 

getunimap et setfont donnent datatables non sortingées, alors que psfgettable semble être sortingé (ainsi que la combinaison des lignes pour les valeurs Unicode qui correspondent au même glyphe). Il y a donc des différences, mais l'information est accessible.

Pour en savoir plus (illustrant pourquoi vous ne pouvez pas utiliser showconsolefont pour résoudre ce problème):

  • Pourquoi showconsolefont a-t-il une sortie différente dans tmux?
  • Imprimez datatables binarys telles quelles sans rompre le terminal

Je suis tombé sur cette question alors que j'essayais d'accomplir la même chose, mais je ne voulais rien laisser à l'écran et je l'ai mis dans une variable, donc je mets ce qui suit dans un script shell que je source:

 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