Почему символы юникода не отображаются правильно

19

Фон:

  • У меня есть несколько символов Юникода в моем приглашении (по сути, маркеры состояния git)
  • Я запускаю urxvt под Xfce на Arch Linux.
  • Я использую шрифт DejaVu Sans Mono для Powerline, указанный в строке .Xresources:

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

Когда я запускаю urxvt, символы юникода не отображаются правильно.

Например

● отображается как â

Однако, если я тогда запускаю новый urxvtизнутри первого терминала, все отрисовывается правильно.

Там, кажется, нет никакой разницы в окружающей среде между двумя терминалами.

В чем может быть разница между первым вызовом и вложенным вызовом? Я подозреваю, что шрифт неправильный в «внешнем» экземпляре, но я не уверен, как проверить шрифт запущенного окна X

ОБНОВЛЕНИЕ : Кажется, что языковой стандарт неправильно настроен в панели запуска приложения для xfce4, но, вероятно, оболочка внутри первого терминала содержит собственную локаль, то есть обе оболочки имеют одинаковую локаль.

добавление

export LANG=en_GB.UTF-8

в .xinitrc до запуска xfce4, кажется, это исправить. Я подозреваю, что это не правильный путь, но он работает достаточно хорошо для меня.

скриншот демонстрирует проблему:

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

Примечание: я перенес этот вопрос с serverfault.com - надеюсь, этот сайт более уместен

sw1nn
источник
Как вы начинаете X? Как запустить «первый» терминал? Кажется, что среда для этих двух отличается.
Ярослав Рахматуллин
Попробуйте запустить LC_ALL=ru_RU.utf8 urxvtиз текущей X сессии. Если русские (и другие Unicode) символы стали правильными, значит, ваша среда работала под языком C. Так что проверьте настройки локали для xfce. Например, если вы запустили его, .xinitrcпопробуйте установить локаль перед запуском, как LANG=ru_RU.utf8 exec startxfce4.
Александр Иванович Графов
У меня такая же проблема. Это было вызвано тем, как я запускал startx. Вместо того, чтобы делать «exec startx», я делал «startx» в моем .zprofile
Самир Садек

Ответы:

12

Я не совсем уверен, в чем причина проблемы, но могут помочь следующие шаги:

  1. Убедитесь, что локаль настроена правильно

    $ locale
    ЛАНГ = 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. Включите нужные локали в /etc/locale.gen и запустите locale-gen

    $ cat /etc/locale.gen | grep UTF
    en_US.UTF-8 UTF-8
    nb_NO.UTF-8 UTF-8
    ru_RU.UTF-8 UTF-8
    
  3. Убедитесь, что нужный шрифт может быть загружен

    $ xset + fp / usr / share / fonts / cyrillic
    $ fc-cache
    $ fc-list # для проверки

  4. Примените настройки из .Xdefaults (или аналогичные) перед запуском «первого терминала»
    xrdb ~ / .Xdefaults

Ярослав Рахматуллин
источник
Это определенно связано с локалью (см. Моё обновление к вопросу), поэтому, принимая этот ответ, он указал мне правильное направление. Thnks.
sw1nn
Обычно не очень хорошая идея поместить настройки локали в ~ / .bash_profile (~ / .zprofile), но ~ / .xinitrc тоже подойдет.
Ярослав Рахматуллин
если я захожу на виртуальный терминал (т.е. без X), то все работает. Бит оболочки работает нормально, он специфичен для X
sw1nn
Вероятно, потому что X (или startxfce) запускается из оболочки без регистрации, которая не читает LANG & co из профиля. Для bash ~ / .bashrc может использоваться для установки содержимого для оболочек, не входящих в систему. Но, как я уже сказал, нет ничего плохого в том, чтобы оставить ваши настройки локали и другие переменные в ~ / .xinitrc.
Ярослав Рахматуллин
Эта проблема также может повлиять на все символы из-за слишком малого расстояния между буквами. Например, set URxvt.letterSpace: -10и все символы отображаются в виде блоков
DavisDude
0

Для меня это была проблема с символами Powerline в urxvt. Только что обнаружил, что установка локали с помощью localectl set-locale LANG=en_AU.UTF-8исправляет проблему для меня, по крайней мере, со шрифтом terminess powerline (не пробовал другие шрифты)

urxvt powerline символы

Это не сработало en_US.UTF-8, я уверен, потому что я могу воспроизвести это ... теперь это странно ... но это работает сейчас.

источник

сыворотки
источник