Bem, primeiro eu acho que eu diria que praticamente todos os terminais atualmente são "virtuais" no sentido de que você fala ... mesmo que o terminal esteja do outro lado de uma porta serial autêntica. Quero dizer, os dias de VT-100 s,
Além disso, digamos que você queira detectar o tipo de suporte Unicode que seu terminal possui. Você pode fazer isso escrevendo caracteres de teste e vendo o que acontece. (Você pode fazer um esforço para apagar os caracteres de teste depois de escrever, mas o usuário ainda pode vê-los brevemente, ou apagá-los pode não funcionar corretamente em primeiro lugar.)
A idéia é pedir ao terminal que lhe informe a posição do cursor, imprima um caractere de teste, pergunte ao terminal novamente para informar sua posição e compare as duas posições para ver até onde o cursor do terminal se moveu.
Para solicitar ao terminal sua posição, consulte aqui . Essencialmente:
echo -e "3[6n"; read -d R foo; echo -en "\nCurrent position: "; echo $foo | cut -d \[ -f 2
Tente produzir "é". Esse caractere leva 2 bytes em UTF-8, mas é exibido em apenas uma coluna na tela. Se você detectar que a saída "é" faz com que o cursor se mova por 2 posições, então o terminal não tem suporte UTF-8 e provavelmente produz algum tipo de lixo. Se o cursor não se moveu, então o terminal provavelmente é apenas ASCII. Se ele se moveu por 1 posição, então parabéns, provavelmente ele pode exibir palavras em francês.
Tente produzir "あ". Esse caractere leva 3 bytes em UTF-8, mas é exibido em apenas duas colunas na tela. Se o cursor se mover por 0 ou 3, más notícias, semelhantes às anteriores. Se ele se move por 1, então parece que o terminal suporta UTF-8, mas não sabe sobre caracteres largos (em fontes de largura fixa). Se se mover por 2 colunas, tudo é bom.
Tenho certeza de que há outros caracteres de sonda que você poderia emitir, o que levaria a informações úteis. Não tenho conhecimento de uma ferramenta que faz isso automaticamente.