[memo] エスケープシーケンスで文字化けした端末を修正する方法とその意味 (0x20a)

セラ (perlackline)

2015年06月08日 17:46



目次 - Perl Index



Theme



Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x20a 回。

日付と時刻を扱うモジュールのひとつ「 Time::Piece 」を確認する予定を変更して、Perl を実行する Unix 系のシステムでお世話になっている「 端末エミュレータ 」( terminal emulator)、いわゆる「 コマンドライン 」そのものが文字化けした場合の対処法と、その手順の意味を確認する。



症状



ここでいう「 端末の文字化け 」は単純なファイルの文字化けではなく、「 バイナリデータ 」のファイルなどを開いた場合に「 端末 」全体の文字が化けてしまう次のような状態を意味します。



開いたファイルの文字列だけではなく、コマンドラインのプロンプト ( 入力を待ち受ける文字列 ) 自体が文字化けしています。

この状態になると、これ以降入力する文字がすべて文字化けしてしまうので作業になりません。

以前の僕はいったんログアウトしてから再ログインする方法しか知りませんでした。しかし、熟成された Unix 系のシステムではこうした状況にも適切な対応方法が用意されています。


解決方法



最初はとても不安な気持ちになるプロンプトの文字化けですが、以下の順序でキーボードを押下することで、文字化けを修正することが出来ます。

「 echo 」->「 space キー 」->「 Ctrl キー + v 」->「 Esc キー 」->「 c 」->「 Enter キー 」。

文字化けしたプロンプトでは、この入力自体も文字化けしますが問題ありません。押し間違いに注意して入力しましょう。



最後に Enter キーを押下すると見慣れたコマンドプロンプトに復帰します。



やりました。


入力の意味



上記文字化けの修正方法は多くの Web ページで紹介されていますが、大抵は入力キーの紹介にとどまっているように見えるので、ここではこの手順の意味を調べてみます。


コマンド「 echo 」



まず最初に入力する文字列「 echo 」は、Unix 系システムの基本的なコマンド「 echo 」です。このコマンドは与えられた文字列を ( 通常は標準出力に ) 出力します。


$ echo test string
test string



コマンド「 echo 」は、同じくシェルのコマンドでリダイレクトを行う「 > 」と組み合わせてよく利用されています。

例えば次のように実行すると、「 echo 」は文字列「 test string 」をファイル「 file 」に上書きします。


$ echo test string > file
$ cat file
test string



「 > 」の代わりに「 >> 」を利用すると、文字列はファイルの末尾に追加されます。


「 Ctrl + v 」「 Esc 」「 c 」



コマンド「 echo 」に続いて押下する「 space キー 」は、純粋にスペースを入力してコマンドに引数を認識させるだけですが、これに続く「 Ctrl キー + v 」->「 Esc キー 」->「 c 」の入力には大きな意味があります。

まず、「 Ctrl + v 」と「 Esc 」はひとつのセットと捉えます。実際にシェル上で「 Ctrl + v 」を押下するとわかりますが、これだけでは何も表示されません。

続いて「 Esc 」を押下します。すると次の記号が表示されます。


^[



これは、「 ^ 」( caret ) と「 [ 」( open bracket ) を組み合わせた文字列ですが、単純に「 ^ 」と「 [ 」を入力して並べただけの文字列とは意味がまったく異なります。

ここに表示された「 ^[ 」は、端末に対して「 これからエスケープシーケンスを入力しますよ 」ということを伝えるための特殊な記号です。

「 エスケープシーケンス 」というのは、通常のキー入力では表現できない特殊な機能を端末上で実行するためのもので、多種多様な機能が用意されています。Perl の正規表現等でも専用のエスケープシーケンスが用意されています。

最後に入力する「 c 」は端末に用意されたエスケープシーケンスの中から「 端末をリセットする 」という機能を提供します。つまり、文字化けした端末の画面をリセットします。

このことから、「 echo 」->「 space キー 」->「 Ctrl キー + v 」->「 Esc キー 」->「 c 」->「 Enter キー 」は、コマンド「 echo 」を利用して端末をリセットするエスケープシーケンス「 ^[c 」を実行することで画面をリセットし、結果として文字化けを解消していたことがわかります。


参考



エスケープシーケンスを体感する - ザリガニが見ていた...。
curses による端末制御 - 釧路工業高等専門学校
バイナリファイルを表示して画面が乱れたときは - @IT
端末エミュレータ - Wikipeda
エスケープシーケンス - Wikipedia


0x20a -> 0x20b へ



次回は、モジュール「 Time::Piece 」の動作を確認します。


参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。

目次 - Perl Index




















関連記事