Как узнать, поддерживает ли терминал UTF-8

Я устанавливаю модуль CPAN для Perl в CentOs 5, и один из вопросов: "Поддерживает ли ваш терминал UTF-8?" (Перефразировать). Как я узнаю?

8 ответов

Решение

Действительно, верный способ проверить это скачать текстовый файл и отследить его в терминале и посмотреть, все ли выглядит хорошо.

или, если вы можете, перекомпилируйте терминал, включив опцию Unicode (при условии, что он есть).

как выглядят $TERM и $LANG?

Введите это в свой терминал:

echo -e '\xe2\x82\xac' 

Если ваш терминал поддерживает UTF-8, он выведет знак евро:

Самый слабый путь: запустить следующий и проверить вывод. Это будет заглавная буква "О" с огибающей, если терминал отображает UTF-8.

perl -le 'print "\x{c3}\x{94}"'

Самый верный способ - использовать команду "locale". Он распечатает все различные переменные, которые определяют, какой набор символов использовать. Например, это мой вывод на RHEL5.3, по умолчанию настроенный на использование только UTF-8.

LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=
curl http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt

или же

wget -O - http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt

Это, очевидно, требует wget или же curl,

Вы можете просто использовать следующую команду:

locale charmap

Вы можете протестировать терминал, установив позицию курсора в столбец 1 и выведя многобайтовый символ Юникода. Если курсор перемещается более чем на 1 позицию, терминал не поддерживает юникод.

В этом случае мы выдаем 3-байтовую последовательность, которая представляет собой пространство нулевой ширины, поэтому, если курсор вообще перемещается, терминал не может обрабатывать Юникод.

      IFS=$';\x1B[' read -p $'\r\xE2\x80\x8B\x1B[6n\r   \r' -d R -rst 1 _ _ _ X _ </dev/tty 2>/dev/tty && test "$X" = 1

Здесь мы выводим\rчтобы добраться до позиции 1, а затем выдать 3-байтовую последовательность, которая представляет собой пространство нулевой ширины, а затем выдатьESC [ 6nкоторый запрашивает позицию курсора, за которым следует\r \rчтобы перезаписать любой мусор, который появится, если терминал обрабатывает каждый байт как отдельный символ.

Затем мы читаем позицию курсора с таймаутом в 1 секунду и проверяем, является ли позиция X позицией 1, которая будет, если терминал может обрабатывать юникод.

Лучшая функция:

      is-tty-unicode() {
  local X

  test -c /dev/tty &&
  if test -t 0
  then IFS=$';\x1B[' read -p $'\r\xE2\x80\x8B\x1B[6n\r   \r' -d R -rst 1 _ _ _ X _ 2>&1
  fi <>/dev/tty && test "$X" = 1
}
UTF=$(echo -e "\u263A")
if [[ ! "$UTF" =~ "A" ]]  ; then
 echo -n "UNICODE here!"
fi
Другие вопросы по тегам