GNU スクリーンはマシンによって表示が異なります

GNU スクリーンはマシンによって表示が異なります

私は走っています

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

Debian Jessie で SSH 経由で実行します。Gentooscreenを実行しているマシンから を作成し、そこから使用すると、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=

Gentoo から SSH 経由で Debian マシンで実行した場合stty -a(`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=

には、 / (行 4) と(行 8)stty -aの 2 つの違いがあります。discardflush-flusho -extproc

screenKubuntu から Debian マシンにログインしたときの出力は、sshログインしていない場合と同じですscreen

答え1

私も同様の問題を抱えていました。プロンプトで特殊な矢印文字を使用しています。ssh では正しく表示されますが、?screen を使用すると が表示されました。

SSH セッションでは、UTF8 オプションを使用して画面を起動できます。 screen -U

この画面セッションでは、文字は正常に表示されるはずです。

オプションがリストされているドキュメントは次のとおりです:スクリーン ユーザーズマニュアル

役に立つと幸いです。

答え2

これは既知の問題openssh-7.3 の修正が予定されています (標準草案)。ディストリビューションでこれが修正される前に、手動で実行する回避策があります (または、ログイン スクリプトの一部で実行します)。

stty iutf8

これにより、ローカル シェルと同様に、tty フラグが utf8 に設定されます。

関連情報