Ekrandan bile terminalimin ne kadar Unicode desteklediğini tespit edin


10

Sorun şu: Terminalim iyi bir unicode yapabiliyorsa ya da yapamıyorsa, bazı karakterleri kullanmak ya da kullanmamak gibi, bazen renkleri ve diğerlerinin altını çizenleri ayırt etmek istiyorum.

Motivasyon, herhangi bir sanal terminalde iyi fontlar aldığım için ortaya çıkıyor, ancak temel Linux konsolunun 256 veya 512 eşzamanlı sembol karakter kümesine sahip olduğunu anlıyorum, bu yüzden tam yazı tipi desteği bekleyemezsiniz.

İlk başta kullanabileceğimi düşündüm $TERMveya tty, ama işte yakalama: Ben de byobu kullanıyorum, bu yüzden $TERMher zaman "screen.linux". Tty'nin çıktısı da çok iyi değildir: /dev/pts/<some number>hem "gerçek" hem de sanal terimlerle.

$BYOBU_TTYyardım da değildir, çünkü örneğin olabilir /dev/tty1ve oturum Ctrl+ Alt+ içinde açıldığında F1karakterler gösterilmez, ancak bazı X terimlerinden aynı oturuma eklenirken düzgün bir şekilde gösterilir ve yine $BYOBU_TTYde değişmez. Ayrıca, byobu'nun var olup olmadığını varsaymadan bunu tespit edebilmek istiyorum.

Ayrıca, yerel ayar her durumda en_US.UTF-8

Yine de bir şekilde bakışlar (bunu tespit ettiğim belirli bir aracı adlandırmak için), byobu'nun içinde bile, byobu oturumuna bağladığım terminale bağlı olarak farklı çıktılar kullanıyor.

Google ile sorun yaşıyorum çünkü terminal ve tty çok yaygın arama terimleri gibi görünüyor. En çok tavsiye $TERMveya tty çözümlere varıyorum.

Yanıtlar:


6

İlk olarak, sanırım bugünlerde tüm terminallerin sizin bahsettiğiniz anlamda "sanal" olduğuna dikkat çekerim ... terminal iyi niyetli bir seri portun diğer ucunda olsa bile. Demek istediğim, VT-100 s, Wyse terminalleri ve diğer "fiziksel", "gerçek" terminaller günleri çoktan gitti!

Bu bir yana, terminalinizin ne tür bir Unicode desteğine sahip olduğunu tespit etmek istediğinizi varsayalım. Bunu test karakterlerini yazarak ve ne olduğunu görerek yapabilirsiniz. (Daha sonra yazdıktan sonra test karakterlerini silmek için çaba gösterebilirsiniz, ancak kullanıcı bunları kısa bir süre için görebilir veya silmek, ilk etapta düzgün çalışmayabilir.)

Fikir, terminalden size imleç konumunu söylemesini istemek, bir test karakteri çıkarmak, terminalden tekrar size konumunu söylemesini istemek ve terminalin imlecinin ne kadar ilerlediğini görmek için iki konumu karşılaştırmaktır.

Terminalden konumunu sormak için buraya bakın . esasen:

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

"É" çıktısını almayı deneyin. Bu karakter UTF-8'de 2 bayt alır, ancak ekranda yalnızca bir sütunda görüntülenir. "É" çıktısının imlecin 2 konuma hareket etmesine neden olduğunu tespit ederseniz, terminalin hiç UTF-8 desteği yoktur ve muhtemelen bir çeşit çöp çıkarmıştır. İmleç hiç hareket etmediyse, terminal muhtemelen sadece ASCII'dir. 1 pozisyona taşındıysa, tebrikler, muhtemelen Fransızca kelimeler gösterebilir.

"あ" çıktısını almayı deneyin. Bu karakter UTF-8'de 3 bayt alır, ancak ekranda yalnızca iki sütun olarak görüntülenir. İmleç 0 veya 3 hareket ederse, yukarıdakine benzer kötü haber. 1 hareket ederse, terminal UTF-8'i destekliyor gibi görünüyor, ancak geniş karakterleri bilmiyor (sabit genişlikli yazı tiplerinde). 2 sütun hareket ederse, her şey iyidir.

Eminim yayabileceğiniz ve faydalı bilgilere yol açacak başka sonda karakterleri vardır. Bunu otomatik olarak yapan bir aracın farkında değilim.


1
Öneri için teşekkürler, Celada. Ancak, çalışmıyor: Doğru konumların bildirildiğini doğru şekilde görüyorum (é için 1, あ için 2). Tek fark, XI içinde gerçek karakterleri tty1'de bir elmas gördüğümdür. Bu yüzden terminal gerçekten utf-8'i destekliyor, ancak kullanılan yazı tipindeki karakterden yoksun.
Álex

Şimdi showconsolefont komutunu gördüm. Bu olası bir çözüm gibi görünüyordu (-v ile yazı tipinin 512 karakterlik olduğunu bildirir). Ne yazık ki, sadece byobu kullanılmadığında çalışır. Bu son durumda, "Konsola başvuruda bulunan bir dosya tanımlayıcı alınamadı" ile hata yapar. Açıkça tty'yi (-C seçeneği) geçersem, hata "/ dev / pts / 37 açılamadı" olur
Álex


3

OP'nin asıl sorusu şu: Linux konsolu Unicode değerlerini destekliyor ve bunlar çalışırken tespit edilebilir screen. Prensip olarak, konsol için Unicode haritasını alarak bunu yapabilirsiniz.

kbdKaynak ağacı içeren getunimap(ve manuel sayfa). Kılavuz sayfası şunu söylüyor

Getunimap programı eski ve kullanılmıyor. Şimdi setfont'un bir parçası

ki bu tam olarak doğru değil. kabaca aynı şeyi setfontyapan bir seçeneği vardır :

   -ou file                                  
          Save previous Unicode map in file

Farklılıklar:

  • setfontbir dosyaya getunimapyazarken standart çıktıya yazar
  • getunimap eşlenecek karakteri yorum olarak gösterir.

Örneğin:

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

karşı

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

İçinde çalıştırıyorsanız screen(veya örneğin çalışan xtermve değil konsolda), kullandığınız çalışabilirsiniz izinleri hata alırsınız sudo.

Hangi yazı tipinin yüklendiğini bilirsem, (özel izinler olmadan) kullanarak psfgettable, örneğin,

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

setfontyazı tipini yüklemek için kullanılacak eşleme verilerine bakın (Unicode eşlemesi ile):

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

Hem getunimapve hem setfontsıralanmamış verileri verirken, sıralanmış gibi psfgettablegörünür (aynı glifle eşleşen Unicode değerleri için satırları birleştirir). Yani farklılıklar var, ancak bilgiye erişilebilir.

Daha fazla okuma ( showconsolefontbu sorunu çözmek için neden kullanamadığınızı gösteren):


Thomas, orijinal sorumu açıklığa kavuşturduğum için beni doğru yola koyduğun için teşekkürler Bilgilerinizden basit bir tek astar almaya çalışacağım ve sonuçlarla geri döneceğim. Kullanım sudodurumum için bir engel yok.
Álex

Şimdi, bu ilginç: setfontsanal terminaller içinde hiçbir şey (verilen dosyayı oluşturmaz veya bir hata çıkarmaz) çıkarmaz, ancak gerçek terminallerde beklendiği gibi çalışır. Bu Ubuntu'da 16.04
Álex

2

Ben aynı şeyi yapmaya çalışırken bu soruyla karşılaştım, ama ekranda bir şey bırakmak ve bir değişken ayarlamak istemiyordu, bu yüzden ben kaynak bir kabuk betiği aşağıdaki koymak:

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

1
Katkınız için teşekkürler Jeff. Ne yazık ki temel konsolda bile her zaman Y alıyorum: S
Álex
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.