Dlaczego znaki Unicode nie wyświetlają się poprawnie?

19

Tło:

  • Mam kilka znaków Unicode w moim monicie (zasadniczo znaczniki statusu git)
  • Uruchamiam Urxvt pod XFCE na Arch Linux.
  • Używam DejaVu Sans Mono dla czcionki Powerline, określonej za pomocą wiersza .Xresources:

    URxvt*font: xft:DejaVu Sans Mono for Powerline:pixelsize=14

Kiedy uruchamiam urxvt, znaki Unicode nie renderują się poprawnie.

Na przykład

● renderuje jako â

Jeśli jednak zacznę nowy urxvtod wewnątrz pierwszego terminala, wszystko będzie renderowane poprawnie.

Wydaje się, że nie ma żadnej różnicy w środowisku między dwoma terminalami.

Jaka może być różnica między pierwszym wywołaniem a wywołaniem zagnieżdżonym? Podejrzewam, że czcionka jest niepoprawna w wystąpieniu „zewnętrznym”, ale nie jestem pewien, jak sprawdzić czcionkę działającego okna X

AKTUALIZACJA : Wygląda na to, że ustawienia regionalne nie są poprawnie skonfigurowane w programie uruchamiającym aplikacje dla xfce4, ale przypuszczalnie powłoka wewnątrz pierwszego terminala wprowadza własne ustawienia regionalne, co oznacza, że ​​obie powłoki mają takie same ustawienia regionalne.

dodawanie

export LANG=en_GB.UTF-8

na .xinitrc przed uruchomieniem xfce4 wydaje się to naprawić. Podejrzewam, że to nie jest właściwy sposób, ale działa dla mnie wystarczająco dobrze.

zrzut ekranu pokazuje problem:

wprowadź opis zdjęcia tutaj

Uwaga: przeniosłem to pytanie z serverfault.com - mam nadzieję, że ta strona jest bardziej odpowiednia

sw1nn
źródło
Jak zacząć X? Jak uruchomić „pierwszy” terminal? Wydaje się, że środowisko tych dwóch środowisk jest inne.
Ярослав Рахматуллин
Spróbuj uruchomić LC_ALL=ru_RU.utf8 urxvtz bieżącej sesji X. Jeśli rosyjskie znaki (i inne znaki Unicode) są poprawne, oznacza to, że twoje środowisko działało w ustawieniach regionalnych C. Sprawdź ustawienia regionalne dla xfce. Na przykład, jeśli zostałeś uruchomiony, .xinitrcspróbuj ustawić ustawienia regionalne przed uruchomieniem jak LANG=ru_RU.utf8 exec startxfce4.
Alexander I.Grafov
Miałem ten sam problem. Było to spowodowane sposobem, w jaki zaczynałem startx. Zamiast robić „exec startx” robiłem „startx” w moim .zprofile
Samir Sadek

Odpowiedzi:

12

Nie jestem do końca pewien, co jest przyczyną problemu, ale poniższe kroki mogą pomóc:

  1. Sprawdź, czy ustawienia regionalne są poprawnie skonfigurowane

    $ locale
    LANG = en_US.UTF-8
    LC_CTYPE = "en_US.UTF-8"
    LC_NUMERIC = "en_US.UTF-8"
    LC_TIME = "en_US.UTF-8"
    LC_COLLATE = "en_US.UTF-8"
    LC_MONETARY = "en_US.UTF-8"
    LC_MESSAGES = "en_US.UTF-8"
    LC_PAPER = "en_US.UTF-8"
    LC_NAME = „en_US.UTF-8”
    LC_ADDRESS = "en_US.UTF-8"
    LC_TELEPHONE = "en_US.UTF-8"
    LC_MEASUREMENT = "en_US.UTF-8"
    LC_IDENTIFICATION = "en_US.UTF-8"
    LC_ALL = en_US.UTF-8
    
  2. Włącz żądane ustawienia narodowe w /etc/locale.gen i uruchom locale-gen

    $ cat /etc/locale.gen | grep UTF
    pl_US.UTF-8 UTF-8
    nb_NO.UTF-8 UTF-8
    ru_RU.UTF-8 UTF-8
    
  3. Upewnij się, że można załadować żądaną czcionkę

    $ xset + fp / usr / share / fonts / cyrillic
    $ fc-cache
    $ fc-list # do sprawdzenia

  4. Zastosuj ustawienia .Xdefault (lub podobne) przed uruchomieniem „pierwszego terminala”
    xrdb ~ / .Xdefaults

Ярослав Рахматуллин
źródło
Ma to zdecydowanie związek z ustawieniami regionalnymi (zobacz moją aktualizację pytania), więc zaakceptowanie tej odpowiedzi, ponieważ wskazało mi właściwy kierunek. Dziękuję
sw1nn
Zazwyczaj umieszczanie ustawień regionalnych w ~ / .bash_profile (~ / .zprofile) zwykle nie jest straszne, ale ~ / .xinitrc też by działało.
Ярослав Рахматуллин
jeśli zaloguję się na terminalu wirtualnym (tj. bez X), wszystko działa. Bit powłoki działa dobrze, jest specyficzny dla X
sw1nn
Prawdopodobnie dlatego, że X (lub startxfce) jest uruchamiany z powłoki niezalogowanej, która nie odczytuje LANG & co z profilu. W przypadku bash ~ / .bashrc może być używany do ustawiania rzeczy dla powłok niezalogowanych. Ale jak powiedziałem, nie ma nic złego w pozostawieniu ustawień regionalnych i innych zmiennych w ~ / .xinitrc.
Ярослав Рахматуллин
Ten problem może również wpływać na wszystkie znaki ze względu na zbyt małe odstępy między literami. Na przykład set URxvt.letterSpace: -10i wszystkie znaki są wyświetlane jako pola
DavisDude
0

Dla mnie to był problem z glifami Powerline w urxvt. Właśnie dowiedziałem się, że ustawienie regionalne za pomocą localectl set-locale LANG=en_AU.UTF-8rozwiązuje problem, przynajmniej z czcionką powerline terminess (nie próbowałem innych czcionek)

symbole powerline urxvt

To nie działało en_US.UTF-8, jestem całkiem pewien, ponieważ mogę to odtworzyć ... to dziwne ... ale teraz działa.

źródło

SERA
źródło