GNU屏幕在不同的机器上显示不同

GNU屏幕在不同的机器上显示不同

我在跑步

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

在 Debian Jessie 上通过 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 
�БВГДЕЖЗИЙКЛ����РСТУФХЦЧШЩЪЫЬЭЮЯ
абвгдежзийклмноп�����
        ��           �
��������

如果我在 Gentoo 上创建一个,然后从 Kubuntu 打开它,编码也会被破坏,screen但方式不同:所有非拉丁字符都会被替换为“?”符号。

我在 Gentoo 和 Kubuntu 上都使用 Konsole 作为我的终端。

我该如何修复这个编码问题?


更新:根据@Jakuje的建议,我在Debian机器上添加了stty iutf8~/.profile之后,我得到了这个:

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通过 Gentoo 的 SSH 在 Debian 机器上执行(有或没有 `screen),输出完全相同。此外,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=

Kubuntu,本地终端:

$ 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当我从 Kubuntu 进入 Debian 机器时,内部的输出ssh与没有的内部输出相同screen

答案1

我遇到了类似的问题,我的提示符使用了一个特殊的箭头字符。通过 ssh 可以正确显示,但?使用 screen 时出现了一个问题。

在您的 ssh 会话中,您可以使用 UTF8 选项启动屏幕: screen -U

在此屏幕会话中,字符应该正常显示。

这里列出了选项的文档:屏幕使用手册

我希望这会有所帮助。

答案2

这是已知问题计划修复 openssh-7.3 (标准草案)。在您的发行版中修复此问题之前,有一种解决方法是手动运行(或在您的某些登录脚本中运行):

stty iutf8

这会将您的 tty 标志设置为 utf8,作为您的本地 shell。

相关内容