terminal: wyświetlanie znaków specjalnych

11

W niektórych programach, takich jak htoplinie i ramki, nie są wyświetlane poprawnie. Zamiast tego są wyświetlane jako -i /.

wprowadź opis zdjęcia tutaj

Ale na innym komputerze są one wyświetlane poprawnie jako odpowiednie linie:

wprowadź opis zdjęcia tutaj

Nie jestem pewien, czy jest to problem z terminalem, czy może jakiś pakiet jest potrzebny.

W przypadku, gdy jest to istotne: Mój system to Debian Wheezy, moim tłumaczem jest, basha emulatorem terminala jestgnome-terminal

Martin Vegter
źródło
Czy próbowałeś zmienić czcionkę używaną przez terminal?
goldilocks
2
Byłoby to możliwe rozwiązanie, gdyby znaki zastępcze, takie jak pola lub znaki zapytania, zastępowały znaki Unicode, ale jego przykład pokazuje htopwyświetlanie znaków ASCII. Jeśli jednak domyślną czcionką terminala jest inna niż Unicode, kodowanie jest również prawdopodobne, więc dodałem to do mojej odpowiedzi.
raehik

Odpowiedzi:

11

Twój najlepszy przykład działa z ustawieniami narodowymi innymi niż Unicode (tj. ASCII). Sprawdź swoją zmienną środowiskową $ LANG (spróbuj export | grep LANG); najprawdopodobniej nie znajdziesz .UTF-8przyrostka. Spróbuj dodać:

export LANG=$LANG.UTF-8

Twój drugi przykład działa z ustawieniami regionalnymi UTF-8, które powinny być domyślne dla najnowszych powłok. Wygląda na to, że htopwykrywa twoje ustawienia regionalne i wyświetla znaki ASCII lub Unicode - więc na dolnym obrazku otrzymujesz ładne znaki Unicode, podczas gdy z ASCII dostajesz całkiem prowizoryczne. Sugeruję zmianę ustawień regionalnych górnego obrazu komputera na Unicode (zobacz Ustawienia regionalne - Wiki Debiana ).

Jeśli to nie zadziała, przyczyną może być emulator terminala . Domyślne kodowanie może być inne niż Unicode. Zmień domyślne kodowanie emulatora terminala na UTF-8 (w xfce4-terminalI znalazłem to w zakładce Zaawansowane). Jeśli nie możesz, być może twoja obecna czcionka nie obsługuje Unicode: spróbuj zmienić czcionkę na Unicode.

[O dziwo, stwierdziłem, że kiedy zmieniłem ustawienia regionalne na ASCII raz w sesji powłoki, htopzawsze wyświetla znaki ASCII, nawet po ich ponownym przywróceniu. To może być twój problem, jeśli z jakiegoś powodu od czasu do czasu zmieniasz ustawienia regionalne w swojej powłoce.]

raehik
źródło
3

Dziwne jest to, że htopużywa ncurses, które mogą rysować linie z / bez Unicode. Jednak patrząc na kod źródłowy w CRT.cpokazuje wyjaśnienie:

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

a CRT_treeStrUtf8wartość to

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 ─
};

Jednak ncurses (dowolna implementacja curses) ma przenośne symbole dla tych, które nie zależą od tego, czy kodowanie to UTF-8, czy nie. Niektóre aplikacje (takie jak okna „s --ascii-linesopcja) stanowią opcję dla używając ASCII do rysowania, ale wniosek, że nawet nie spróbuje użyć wiersza rysunku przedstawione w ncurses nie jest efektywne wykorzystanie biblioteki.

Krótko mówiąc, kiedy natkniesz się na taki program, powinieneś zgłosić go jako błąd programistom.

Dalsza lektura:

Thomas Dickey
źródło
Chociaż nie rozwiązało to bezpośrednio mojego problemu (ustawienie LANG/ LC_ALLwłączenie oczekiwanych znaków rysowania linii w Unicode htop), jest to bardzo interesujące. Dziękujemy za poświęcenie czasu na wyjaśnienie tego!
wrksprfct