LINUX.ORG.RU
ФорумAdmin

st не выводит кириллицу

 , ,


0

1

Раскоментировал /etc/locale.conf языки,экспортировал русский язык в /etc/bash/bashrc.d/artix.bashrc и все равно locale выводит:

LANG=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
'''



Перемещено hobbit из general

Не знаю поможет ли это чем-нибудь, но в моём случае в locale.conf есть только одна строка LANG=en_US.UTF-8. Соответственно, 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=

В файл artix.bashrc я ничего не экспортировал, насколько я помню. Я вообще нигде не добавлял русскую локаль. При этом кириллица во всех программах и в консоли отображается нормально. Шрифт в консоли: Terminus.

Проверь в ядерной консоли.

Попробуй временно установить другой эмулятор терминала; что-нибудь «жирное» и без зависимостей, типа alacritty.

Но думаю, дело не в st. Ради теста проверил вариант с POSIX и кириллица в st стала выглядеть так:

'$'\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271'' '$'\321\204\320\260\320\271\320\273''.txt'

Нужно как-то чинить кодировку.

k6
()
Последнее исправление: k6 (всего исправлений: 1)

Просто отсутстувует переменная LANG в среде. Вот есть переменная LANG:

$ env |grep -e ^LANG -e ^LC_
LANG=en_US.utf8
$ locale
LANG=en_US.utf8
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=

А вот нет переменной LANG:

$ env -u LANG locale
LANG=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
iliyap ★★★★★
()

Вообще /etc/locale.conf это конфигурационный файл systemd. Он берёт из него переменные среды локали (LANG, LC_XXX) и ставит их в процессе PID 1. Остальные процессы, которые форкает PID 1, наследуют от него переменные среды.

dinit берёт переменные среды из /etc/dinit/environment и ставит их в процессе PID 1. Отдельного файла для переменных среды локали нет, их надо просто вписать в этот глобальный файл.

Локаль пользователя для графической сессии gdm или lightdm берёт в сервисе accountsservice (org.freedesktop.Accounts).

Локаль пользователя для текстовой сессии обычно пользователи сами себе выставляют в ~/.profile.

iliyap ★★★★★
()
Ответ на: комментарий от iliyap

Так у меня всё даже забавнее чем я себе представлял.

dinit берёт переменные среды из /etc/dinit/environment

У меня dinit, но нет ни файла environment, ни самой директории dinit в /etc.

Локаль пользователя для графической сессии

Дисплейного менеджера у меня тоже нет, нет и accountsservice, соответственно.

Локаль пользователя для текстовой сессии обычно пользователи сами себе выставляют в ~/.profile.

Файла .profile в домашней директории тоже нет.
У меня вообще ничего нет. Я голодранец! :-D
Кроме шуток, текстовая сессия — пока единственное место, которое я нашёл где неправильно отобразилась кириллица. Вместо названия файла что-то типа транслита.

Вообще /etc/locale.conf это конфигурационный файл systemd.

Но в моём случае используется всё-таки он если я правильно понял.
Судя по комментариям в скрипте /etc/profile.d/locale.sh: # /etc/locale.conf loads and overrides by kernel command line is done by systemd # But we override it here.

Содержание скрипта:

#!/bin/sh

# load locale.conf in XDG paths.
# /etc/locale.conf loads and overrides by kernel command line is done by systemd
# But we override it here, see FS#56688
if [ -z "$LANG" ]; then
  if [ -n "$XDG_CONFIG_HOME" ] && [ -r "$XDG_CONFIG_HOME/locale.conf" ]; then
    . "$XDG_CONFIG_HOME/locale.conf"
  elif [ -n "$HOME" ] && [ -r "$HOME/.config/locale.conf" ]; then
    . "$HOME/.config/locale.conf"
  elif [ -r /etc/locale.conf ]; then
    . /etc/locale.conf
  fi
fi

# define default LANG to C.UTF-8 if not already defined
LANG=${LANG:-C.UTF-8}

# export all locale (7) variables when they exist
export LANG LANGUAGE LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY \
       LC_MESSAGES LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT \
       LC_IDENTIFICATION

Файла locale.conf в домашней директории у меня тоже нет (помним, что я голодранец) и скрипт смотрит-таки в /etc/locale.conf и устанавливает локаль. А в случае если locale.conf пустой, то устанавливает LANG=${LANG:-C.UTF-8}. Если я всё правильно понял, конечно.

k6
()