UTF8環境のGNU Screen 4.1/4.2でNCursesの表示がおかしくなる

LANG=ja_JP.UTF8でGNU Screen 4.1/4.2を使って、asciiコード以外の文字を表示するNcursesアプリを動かすと画面表示がおかしくなってしまいます。

Linuxカーネルやbusyboxのmake menuconfigがまともに動作しません。

GNU Screen 4.1/4.2は最近のLinuxディストリで使われている為、対応に苦慮しています。


1 表示がおかしくなる現象

CentOS 6でscreenした後にNcursesを動かした場合(正しく表示)。

 

https://dl-web.dropbox.com/s/w8lf7v5e53k475i/0001_CentOS-6-screen.png

 

 

CentOS7でscreenした後にNcursesを動かした場合(表示が乱れる)。

 

https://dl-web.dropbox.com/s/czhk05se4hjbla4/0002_CentOS-7-screen.png

 

 

2 問題が起こるディストリと起こらないディストリ

問題が起こるディストリ。

CentOS 7、Fedora 21、Fedora 22、Ubuntu 14.04、Debian 8

問題が起こらないディストリ。

CentOS 6、Ubuntu 12.04、Debian 7

試行錯誤した結果、screenのバージョンが4.0では問題が起こりません。

ただし、Debian 7は4.1ですが問題は起きません。

パッチで修正されているのか、configureの問題なのか、4.01.xx以降で起こるのか不明です。

また、LANG=Cな環境では問題は起こりません。

 

 

3 回避策: LANGを変更する

screenコマンドを実行する前にLANGを変更します。

$ LANG=C screen # screen上でscreenする場合はLANG=Cが引き継がれる

ただし、UTF8の日本語入力ができなくなります。

LANG=Cのみで済ませる方はそもそも本問題に直面しないので本末転倒かも。

 

 

4 回避策: CentOS 6とUbuntu 12.04のGNU Screen 4.0を使う

CentOS 7の場合はCentOS 6のGNU Screenを、Debian系はUbuntu 12.04のGNU Screen 4.0をリビルドして使います。

Fedoraの場合は-Werror=format-securityオプションが有効な為、ソースコードの修正が必要になります。

 

4.1 CentOS 7の場合

CentOS 6のSRPMを利用します。

sudo yum update -y
sudo yum install -y screen
sudo yum remove -y screen
sudo yum install -y rpm-build gcc
sudo yum-builddep -y screen
mkdir screen
cd screen
wget http://vault.centos.org/6.6/os/Source/SPackages/screen-4.0.3-16.el6.src.rpm
rpmbuild --rebuild screen-4.0.3-16.el6.src.rpm
sudo rpm -i ~/rpmbuild/RPMS/x86_64/screen-[Version].rpm

4.2 Debian系の場合

Ubuntu 12.04のソースコードを利用します。

sudo apt-get update -y
sudo apt-get upgrade -y
sudo apt-get install -y screen
sudo apt-get remove -y screen
sudo apt-get build-dep -y screen
sudo apt-get install -y dpkg-dev fakeroot dpatch
mkdir screen
cd screen
wget http://jp.archive.ubuntu.com/ubuntu/pool/main/s/screen/screen_4.0.3-14ubuntu8.dsc
wget http://jp.archive.ubuntu.com/ubuntu/pool/main/s/screen/screen_4.0.3-14ubuntu8.diff.gz
wget http://jp.archive.ubuntu.com/ubuntu/pool/main/s/screen/screen_4.0.3.orig.tar.gz
dpkg-source -x screen_4.0.3-14ubuntu8.dsc
cd screen-4.0.3/
tmp=`mktemp`
grep -v "dh_installinfo" debian/rules > ${tmp}
cp ${tmp} debian/rules
rm -f ${tmp}
dpkg-buildpackage -us -uc
sudo dpkg -i ../screen_[Version].deb

dh_installinfoに問題があるようなので、infoは含めないようにします。

 

4.3 Fedoraの場合

CentOS 7と同じようにリビルドするとエラーになります。

screen.c: In function 'MakeNewEnv':
screen.c:1876:14: error: format not a string literal and no format
arguments [-Werror=format-security]
     Panic(0, strnomem);

Fedoraではrpmbuild実行時に-Werror=format-securityオプションがデフォルトで有効になる為です。

${HOME}/rpmbuildディレクトリにビルド用の領域ができるので、上記を修正したパッチを加えてFedora 22のSRPMを作成しました。

 

ダウンロード
CentOS6のscreenをFedora22向けにリビルドしたSRPM
screen-4.0.3-16.fc22.tar.gz
GNU tar 848.3 KB

5 解決策: .screenrcでcjkwidth offを設定する

screenのgitのコードを試していったところ、以下のパッチで本現象が発生するようです。

commit b8fd0c833bbd910a525d270ebc8f7e87ee00cb0a
    Width toggle for ambiguous East Asian chars, courtesy Yi-Hsuan Hsin (#16666).

このパッチは全角文字を適切に表示する為のもののようです。

.screenrcでcjkwidth offを設定したところ、Ncursesアプリが適切に表示されました。

ターミナルソフトの設定のおかげなのか、全角文字も適切な幅で表示されています。