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


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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.