Экран GNU отображается по-разному на разных машинах


1

Я бегаю

$ screen --version
Screen version 4.03.01 (GNU) 28-Jun-15

на Debian Джесси через SSH. Если я создаю на screenкомпьютере под управлением Gentoo, а затем использую его оттуда, символы Unicode (в частности, кириллицы) всегда печатаются правильно.

Однако, если я создаю screenиз Kubuntu (16.04, полностью обновлен с 15.04), кодировка нарушена. Рассмотрим этот скрипт Python (команды выполняются без screen):

$ cat test.py 
print(''.join(chr(c) for c in range(ord('А'), ord('Я') + 1)))
print(''.join(chr(c) for c in range(ord('а'), ord('я') + 1)))
print('Ёё')

$ python3 test.py 
АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
абвгдежзийклмнопрстуфхцчшщъыьэюя
Ёё

Теперь я создаю screenи пробую то же самое оттуда:

$ screen -S test

$ python3 test.py 
�БВГДЕЖЗИЙКЛ����РСТУФХЦЧШЩЪЫЬЭЮЯ
абвгдежзийклмноп�����
        ��           �
��������

Кодировка также нарушается, если я создаю в screenGentoo, а затем открываю его из Kubuntu, но другим способом: все нелатинские символы заменяются на '?' знаки.

Я использую Konsole в качестве терминала в Gentoo и Kubuntu.

Как я могу исправить эту проблему кодирования?


UPD: после предложения @Jakuje я добавил stty iutf8его ~/.profileна машину Debian. После этого я получаю это:

Gentoo, локальный терминал:

$ stty -a
speed 38400 baud; rows 55; columns 243; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon ixoff -iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

$ locale
LANG=es_ES.UTF-8
LC_CTYPE="es_ES.UTF-8"
LC_NUMERIC="es_ES.UTF-8"
LC_TIME="es_ES.UTF-8"
LC_COLLATE="es_ES.UTF-8"
LC_MONETARY="es_ES.UTF-8"
LC_MESSAGES="es_ES.UTF-8"
LC_PAPER="es_ES.UTF-8"
LC_NAME="es_ES.UTF-8"
LC_ADDRESS="es_ES.UTF-8"
LC_TELEPHONE="es_ES.UTF-8"
LC_MEASUREMENT="es_ES.UTF-8"
LC_IDENTIFICATION="es_ES.UTF-8"
LC_ALL=

Если я выполняю stty -aна компьютере Debian через SSH из Gentoo (с `или без экрана '), вывод будет точно таким же. Также Gentoo -SSH-> Debian:

$ locale
LANG=en_US.UTF-8
LANGUAGE=
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=

Кубунту, местный терминал:

$ stty -a
speed 38400 baud; rows 43; columns 172; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon ixoff -iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc

$ locale
LANG=ru_RU.UTF-8
LANGUAGE=fr:en_US:es:ru
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC=ru_RU.UTF-8
LC_TIME=ru_RU.UTF-8
LC_COLLATE=ru_RU.UTF-8
LC_MONETARY=ru_RU.UTF-8
LC_MESSAGES=POSIX
LC_PAPER=fr_FR.UTF-8
LC_NAME=fr_FR.UTF-8
LC_ADDRESS=fr_FR.UTF-8
LC_TELEPHONE=fr_FR.UTF-8
LC_MEASUREMENT=ru_RU.UTF-8
LC_IDENTIFICATION=fr_FR.UTF-8
LC_ALL=

Kubuntu -SSH-> Debian:

$ stty -a
speed 38400 baud; rows 43; columns 172; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon ixoff -iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

$ locale
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=ru_RU.UTF-8
LC_TIME=ru_RU.UTF-8
LC_COLLATE=ru_RU.UTF-8
LC_MONETARY=ru_RU.UTF-8
LC_MESSAGES=POSIX
LC_PAPER=fr_FR.UTF-8
LC_NAME=fr_FR.UTF-8
LC_ADDRESS=fr_FR.UTF-8
LC_TELEPHONE=fr_FR.UTF-8
LC_MEASUREMENT=ru_RU.UTF-8
LC_IDENTIFICATION=fr_FR.UTF-8
LC_ALL=

В stty -a, есть 2 различия: discard/ flush(строка 4) и -flusho -extproc(строка 8).

Вывод изнутри, screenкогда я sshв машину Debian из Kubuntu, такой же, как и без screen.


В чем разница stty -aна обеих машинах? Есть ли iutf8? Похоже, ваш tty не поддерживает UTF8.
Jakuje

@Jakuje Я обновил пост. Есть идеи, как это исправить?
Pastafarianist

Ответы:


1

У меня была похожая проблема, моя подсказка использует специальный символ стрелки. Отображается корректно через SSH, но я получил ?при использовании экрана.

В вашей сессии ssh вы можете запустить экран с опцией UTF8: screen -U

В этом сеансе экрана символы должны отображаться нормально.

Вот документация, где перечислены опции: Руководство пользователя экрана

Надеюсь, это поможет.


0

Это известная проблема с запланированным исправлением для openssh-7.3 ( проект стандарта ). Прежде чем это будет исправлено в вашем дистрибутиве, есть обходной путь для запуска вручную (или в некоторых из ваших сценариев входа в систему):

stty iutf8

который установит ваши tty-флаги в utf8, как ваша локальная оболочка.


К сожалению, это ничего не изменило. Разница в том, как выглядят персонажи, все еще есть. Однако stty -aсейчас говорит iutf8.
Pastafarianist

Так как ты localeвыглядишь? Вы замечаете разницу? Там также должно быть utf8, иначе Python будет пытаться использовать другую кодировку.
Jakuje

Я обновил пост с localeинформацией. Есть UTF-8на обеих машинах.
Пастафарианец

Но разные языки. Попробуйте изменить свой клиент ssh, а не отправлять информацию о локали, согласно этому вопросу AU , если это будет иметь значение.
Jakuje
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.