терминал: отображение специальных символов

11

В некоторых программах, таких как htopлинии и кадры, отображаются неправильно. Вместо этого они отображаются как -и /.

введите описание изображения здесь

Но на другой машине они отображаются правильно в виде правильных строк:

введите описание изображения здесь

Я не уверен, является ли это проблемой терминала, или, возможно, необходим какой-то пакет.

Если это актуально: моя система Debian Wheezy, мой переводчик bashи мой эмулятор терминалаgnome-terminal

Мартин Вегтер
источник
Вы пытались изменить шрифт, используемый терминалом?
Златовласка
2
Это было бы возможным решением, если бы вместо символов Юникода вместо символов Юникод использовались символы-заполнители, такие как прямоугольники или вопросительные знаки, но в его примере показано htopотображение символов ASCII. Однако, если шрифт терминала по умолчанию не является Unicode, то, вероятно, также применяется кодировка, поэтому я добавил это в свой ответ.
raehik

Ответы:

11

Ваш лучший пример работает с языком, отличным от Unicode (т.е. ASCII). Проверьте переменную среды $ LANG (попробуйте export | grep LANG); вы, скорее всего, не найдете .UTF-8суффикс. Попробуйте добавить это:

export LANG=$LANG.UTF-8

Ваш другой пример работает с языком UTF-8, который должен использоваться по умолчанию для последних оболочек. Кажется, он htopопределяет вашу локаль и отображает символы ASCII или Unicode - поэтому на нижнем рисунке вы видите красивые символы Unicode, в то время как с ASCII вы получаете некоторые довольно временные символы. Я бы предложил изменить локаль машины верхнего изображения на Unicode (см. Locale - Debian Wiki ).

Если это не сработает, возможно, проблема в эмуляторе терминала . Кодировка по умолчанию может быть не-Unicode. Измените кодировку по умолчанию вашего эмулятора терминала на UTF-8 ( xfce4-terminalя нашел ее на вкладке «Дополнительно»). Если вы не можете, возможно, ваш текущий шрифт не поддерживает Unicode: попробуйте изменить шрифт на Unicode.

[Странно, я обнаружил, что однажды в сеансе оболочки я изменил свой язык на ASCII, htopвсегда отображает символы ASCII, даже после его изменения. Это может быть вашей проблемой, если по какой-то причине вы время от времени меняете локаль в своей оболочке.]

raehik
источник
3

Странно то, что htopиспользуются ncurses, которые могут рисовать линии с / без Юникода. Тем не менее, глядя на исходный код в CRT.cпоказывает объяснение:

#ifdef HAVE_LIBNCURSESW
   if(strcmp(nl_langinfo(CODESET), "UTF-8") == 0)
      CRT_utf8 = true;
   else
      CRT_utf8 = false;
#endif

   CRT_treeStr =
#ifdef HAVE_LIBNCURSESW
      CRT_utf8 ? CRT_treeStrUtf8 :
#endif
      CRT_treeStrAscii;

и CRT_treeStrUtf8значение

const char *CRT_treeStrUtf8[TREE_STR_COUNT] = {
   "\xe2\x94\x80", // TREE_STR_HORZ ─
   "\xe2\x94\x82", // TREE_STR_VERT │
   "\xe2\x94\x9c", // TREE_STR_RTEE ├
   "\xe2\x94\x94", // TREE_STR_BEND └
   "\xe2\x94\x8c", // TREE_STR_TEND ┌
   "+",            // TREE_STR_OPEN +
   "\xe2\x94\x80", // TREE_STR_SHUT ─
};

Однако ncurses (любая реализация curses) имеет переносимые символы для них, которые не зависят от того, является ли кодировка UTF-8 или нет. Некоторые приложения (например, диалог «s --ascii-linesопция) обеспечивают вариант для использования ASCII рисования линий, но приложение , которое даже не пытаться использовать линию вытяжки , представленную в Ncurses не эффективное использование библиотеки.

Короче говоря, когда вы сталкиваетесь с программой, которая ведет себя так, вы должны сообщить об этом разработчикам как об ошибке.

Дальнейшее чтение:

Томас Дики
источник
Хотя это не решило мою проблему напрямую (установив LANG/ LC_ALLвключив ожидаемые символы рисования линий Unicode htop), это очень интересно. Спасибо, что нашли время, чтобы объяснить это!
wrksprfct