Визначте, скільки Unicode підтримує мій термінал, навіть через екран


10

Ось проблема: я хочу, щоб я міг розпізнати, чи мій термінал здатний пристойний unicode чи ні, для того, щоб використовувати деякі символи чи ні, як, наприклад, погляди, які іноді використовують кольори та інші підкреслюють.

Мотивація виникає через те, що в будь-якому віртуальному терміналі я отримую гідні шрифти, але я розумію, що в базовій консолі Linux є набір символів 256 або 512 одночасних символів, тому ви не можете сподіватися на повну підтримку шрифту.

Спочатку я думав, що я можу використовувати $TERMабо tty, але ось улов: я також використовую byobu, так $TERMце завжди "screen.linux". Вихід tty також не дуже показовий: і /dev/pts/<some number>в "реальному", і в віртуальному плані.

$BYOBU_TTYце не допомога, тому що, наприклад, це може бути, /dev/tty1і коли сеанс відкритий у Ctrl+ Alt+, F1символи не відображаються, але при приєднанні до одного і того ж сеансу з якогось X терміну вони відображаються належним чином і все $BYOBU_TTYще не змінюються. Крім того, я хотів би мати можливість виявити це, не вважаючи, що там є чи ні.

Крім того, локал показує у всіх випадках en_US.UTF-8

І все-таки якимось чином поглядає (щоб назвати певний інструмент, який я бачу, виявляючи це), навіть усередині byobu використовує різний вихід, залежно від терміналу, який я приєдную до сеансу byobu.

У мене проблеми з google, оскільки термінали та tty здаються занадто поширеними пошуковими термінами. Найбільше я приходжу до рішень, що рекомендують $TERMабо tty.

Відповіді:


6

Ну, по-перше, я думаю, я хотів би зазначити, що майже всі термінали в наші дні є "віртуальними" в тому сенсі, про який ви говорите ... навіть якщо термінал знаходиться на іншому кінці добросовісного послідовного порту. Я маю на увазі, дні VT-100 s, термінали Wyse та інші "фізичні", "справжні" термінали вже майже минули!

Якщо убік, скажімо, ви хочете виявити, яку підтримку Unicode має ваш термінал. Ви можете зробити це, написавши тестові символи до "І є" і побачивши, що відбувається. (Ви можете докласти зусиль, щоб стерти тестові символи після того, як ви написали потім, але користувач може все-таки побачити їх коротко, або стерти їх може не працювати належним чином.)

Ідея полягає у тому, щоб попросити термінал повідомити вам його положення курсору, вивести тестовий символ, попросити термінал знову повідомити вам його положення та порівняти дві позиції, щоб побачити, наскільки перемістився курсор термінала.

Щоб запитати термінал про його місце, дивіться тут . По суті:

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

Спробуйте вивести "é". Цей символ займає 2 байти в UTF-8, але відображається лише в одному стовпці на екрані. Якщо ви виявите, що вихід "é" призводить до переміщення курсору на 2 позиції, то термінал взагалі не має підтримки UTF-8 і, ймовірно, виводить якийсь сміття. Якщо курсор взагалі не переміщувався, то, можливо, термінал - це лише ASCII. Якщо він перемістився на 1 позицію, то поздоровлення, він, ймовірно, може відображати французькі слова.

Спробуйте вивести "あ". Цей символ займає 3 байти в UTF-8, але відображається лише у двох стовпцях на екрані. Якщо курсор рухається на 0 або 3, погані новини, подібні до вище. Якщо він рухається на 1, то схоже, що термінал підтримує UTF-8, але не знає про широкі символи (у шрифтах фіксованої ширини). Якщо він рухається на 2 стовпчики, все добре.

Я впевнений, що є інші символи зонду, які ви могли б випромінювати, що призведе до корисної інформації. Мені не відомий інструмент, який робить це автоматично.


1
Дякую за пропозицію, Селада. Однак це не працює: я правильно бачу повідомлення про висунуті позиції (1 для é, 2 для あ). Єдина відмінність полягає в тому, що в XI я бачу справжні символи, а в tty1 я бачу діамант. Тому я думаю, що термінал дійсно підтримує utf-8, але не вистачає символу в використовуваному шрифті.
Álex

Я бачив зараз команду showconsolefont. Це здавалося можливим рішенням (з -v він повідомляє, що шрифт є 512-шаблоном). На жаль, він працює лише тоді, коли не використовується byobu. В останньому випадку вона помиляється з "Не вдалося отримати дескриптор файлу, що стосується консолі". Якщо я явно передаю tty (опція -C), помилка стає "Не вдалося відкрити / dev / pts / 37"
Álex

До речі: скрипт sh для визначення термінальної ширини рядка (але це не те , про що йдеться у цьому питанні)
Жил "SO- перестань бути злим"

3

Актуальним питанням OP є: які значення Unicode підтримує консоль Linux, і чи можна їх виявляти під час роботи screen. В принципі, це можна зробити, отримавши мапу Unicode для консолі.

kbdДерево містить джерело getunimap(і його сторінки керівництва). Сторінка керівництва говорить про це

Програма getunimap стара і застаріла. Зараз це частина setfont

що не зовсім так. setfontє варіант, який робить приблизно те ж саме:

   -ou file                                  
          Save previous Unicode map in file

Відмінності:

  • setfontзаписує у файл, тоді як getunimapзаписує на стандартний вихід
  • getunimap показує персонаж, який буде відображений, як коментар.

Наприклад:

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

проти

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

Якщо ви працюєте в screen(або, наприклад, бігаєте, xtermа не на консолі), ви отримаєте помилку дозволу, яку можна обійти за допомогою sudo.

Якщо я знаю, який шрифт завантажений, я можу перевірити, що (без спеціальних дозволів), використовуючи psfgettable, наприклад,

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

і перегляньте дані картографування, які setfontвикористовуються для завантаження шрифту (за допомогою відображення 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і setfontдають дані несортованими, тоді як, psfgettableздається, сортуються (а також поєднуються рядки для значень Unicode, які відображають у той самий гліф). Тож є відмінності, але інформація доступна.

Подальше читання (пояснюючи, чому ви не можете використовувати showconsolefontдля вирішення цієї проблеми):


Спасибі, Томасе, за роз’яснення мого оригінального питання, що поставив мене на правильний шлях. Я спробую отримати просту однолінійку з вашої інформації та повернусь з результатами. Використання sudoне є перешкодою для мого використання.
Алекс

Тепер це цікаво: setfontнічого не видає (не створює заданий файл і не видає помилку) у віртуальних терміналах, але працює у фактичних терміналах, як очікувалося. Це в Ubuntu 16.04
Álex

2

Я зіткнувся з цим питанням, коли я намагався виконати те саме, але не хотів нічого залишати на екрані, і він встановив змінну, тому я поставив наступне в сценарій оболонки, який я джерело:

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
Дякую за внесок, Джефф. На жаль, я завжди отримую Y навіть у базовій консолі: S
Álex
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.