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


11

У деяких програмах, наприклад, htopлінії та кадри відображаються неправильно. Натомість вони відображаються як -і /.

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

Але на іншій машині вони відображаються правильно як правильні лінії:

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

Я не впевнений, це проблема з терміналом чи, можливо, потрібен якийсь пакет.

У випадку, якщо це доречно: Моя система - Debian Wheezy, мій інтерпретатор є bashі мій емулятор терміналуgnome-terminal


Ви спробували змінити шрифт, використовуваний терміналом?
goldilocks

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

Якщо це не працює, можливо, проблема в емуляторі термінала . Кодування за замовчуванням може бути не Unicode. Змініть кодування за замовчуванням емулятора терміналу на UTF-8 ( xfce4-terminalя знайшов це на вкладці Додатково). Якщо ви не можете, можливо, ваш поточний шрифт не підтримує Unicode: спробуйте змінити свій шрифт на Unicode.

[Як не дивно, я виявив, що колись я міняв свою локальну мову на ASCII один раз на сеансі оболонки, htopзавжди відображає символи ASCII, навіть після зміни її назад. Це може бути вашою проблемою, якщо ви з якоїсь причини міняєте локаль у своїй оболонці.]


3

Дивна річ у тому, що htopвикористовують ncurses, які можуть малювати лінії з / без Unicode. Однак, дивлячись на вихідний код у, 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 (будь-яка реалізація прокльонів) є переносні символи, які не залежать від того, чи є кодування UTF-8 чи ні. Деякі додатки (наприклад, діалог «s --ascii-linesопція) забезпечують варіант для використання ASCII малювання ліній, але додаток , яке навіть не намагатися використовувати лінію витяжки , представлену в Ncurses не ефективність використання бібліотеки.

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

Подальше читання:


Хоча це безпосередньо не вирішило мою проблему (встановлення LANG/ LC_ALLвключення очікуваного малювання рядків Unicode в таблиці htop), це дуже цікаво. Дякуємо, що знайшли час, щоб пояснити це!
wrksprfct
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.