f

アーカイブ

2016-10-23

Solution for garbled characters on GNU Screen

GNU Screenを起動すると日本語などが文字化けするようになってしまった。この原因と解決策を記す。

初めはxtermの文字エンコーディングが原因かと思ったが,よく調べていくと違った。GNU Screenの起動中だけ文字化けしていた。そこで,GNU Screenの文字エンコーディング関係のマニュアルを確認してみた。GNU Screenのencコマンドの説明が参考になった。

— Command: encoding enc [denc]
(none)
Tell screen how to interpret the input/output. The first argument sets the encoding of the current window. Each window can emulate a different encoding. The optional second parameter overwrites the encoding of the connected terminal. It should never be needed as screen uses the locale setting to detect the encoding. There is also a way to select a terminal encoding depending on the terminal type by using the ‘KJ’ termcap entry. See Special Capabilities.

Supported encodings are eucJP, SJIS, eucKR, eucCN, Big5, GBK, KOI8-R, CP1251, UTF-8, ISO8859-2, ISO8859-3, ISO8859-4, ISO8859-5, ISO8859-6, ISO8859-7, ISO8859-8, ISO8859-9, ISO8859-10, ISO8859-15, jis.

See also ‘defencoding’, which changes the default setting of a new window.
11.11 Character Processing - Screen User's Manual

ここを参照する限り,GNU Screenは起動時のロケールを端末のロケールとして設定するようだ。

そして,GNU Screenの現在の文字エンコーディングは以下のコマンドで確認できる。

screen -Q info

参考:screen(1) - Linux manual page

実際にLANG環境変数を指定してGNU Screenを起動して,文字エンコーディングを確認すると,以下のとおりになった。

LANG= screen
screen -Q info
(1,4)/(80,41)+1024 -(+)flow G0[BBBB] 0(bash)
LANG=ja_JP-UTF-8 screen
screen -Q info
(1,4)/(80,41)+1024 -(+)flow UTF-8 0(bash)

後ろから2番目のフィールドがGNU Screenの文字エンコーディングを表している。LANG環境変数の設定をなしにすると,G0 (=ASCII)に設定されてしまっている。

問題の起きたマシンでは,LANG環境変数がどこにも設定されておらず,既定のLANG=Cが適用されてしまっていたようだ。.bashrcなどで以下のようにLANG環境変数を設定することで解決した。

export LANG=ja_JP.UTF-8

なお,同種のソフトであるtmuxでもLANG環境変数によって文字化けが発生するか確認したが,問題なかった。tmuxでは起動時のLANG環境変数には依存しないようだ。

0 件のコメント:

コメントを投稿