お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2013-10-25 13:12:25

ext-goki
新しいメンバ
登録日: 2013-10-25

コマンドscriptのログにおける文字化け

Ubuntu,LinuxMintの両方で起こっているのですが、
普段日本語を含むテキストファイルは問題なく表示できているのですが、
terminalの内容を記録するために
コマンドscriptを用いて作成されたログファイルをエディタで開くと
文字化けしています。

例として
terminalから直接コピペすると

sn@7machine:~$ script 001.log
スクリプトを開始しました、ファイルは 001.log です
sn@7machine:~$ ls
001.log           tmp           デスクトップ  ピクチャ

となっていた部分を下にコピペします。

Geditだと
スクリプトは 2013年10月25日 12時09分42秒
に開始しました]0;sn@7machine: ~sn@7machine:~$ exitls
001.log           tmp           デスクトップ  ピクチャ

Geanyだと
スクリプトは 2013年10月25日 12時09分42秒
に開始しました]0;sn@7machine: ~sn@7machine:~$ exitls
001.log           tmp           デスクトップ  ピクチャ

Leafpadだと
スクリプトは 2013年10月25日 12時09分42秒
に開始しました]0;sn@7machine: ~sn@7machine:~$ exitls
001.log           tmp           デスクトップ  ピクチャ

notepadだと
繧ケ繧ッ繝ェ繝励ヨ縺ッ 2013蟷エ10譛・5譌・ 12譎・9蛻・2遘・ 縺ォ髢句ァ九@縺セ縺励◆]0;sn@7machine: ~sn@7machine:~$ exitls
001.log           tmp           繝・せ繧ッ繝医ャ繝・[0m  繝斐け繝√Ε

wordpad(Wine)だと
繧ケ繧ッ繝ェ繝励ヨ縺ッ 2013蟷エ10譛・5譌・ 12譎・9蛻・2遘・ 縺ォ髢句ァ九@縺セ縺励◆]0;sn@7machine: ~sn@7machine:~$ exitls
001.log           tmp           繝・せ繧ッ繝医ャ繝・[0m  繝斐け繝√Ε


このページにコピペするとなぜか
トーフ化した文字の部分が全て消えてしまっています。
エディタで表示した場合の
トーフ化した文字一文字分を**で表示することにしますと
Geditだと

スクリプトは 2013年10月25日 12時09分42秒
に開始しました**]0;sn@7machine: ~**sn@7machine:~$ exit**[2Pls
001.log           **[0m**[01;34mtmp**[0m           **[01;34mデスクトップ**[0m  **[01;34mピクチャ**[0m

となっています。

Ubuntuではインストールした後に
言語入力でいじった部分はありません。
LinuxMintの方は、
そのままでは日本語表示・入力ができないので
記憶では言語サポートから設定を行っただけです。

なぜこのようなことがおこるのでしょうか?
どなたかお分かりになりますか?

オフライン

 

#2 2013-10-25 17:09:08

si
メンバ
From: hokkaido kitami, jp
登録日: 2007-01-15

Re: コマンドscriptのログにおける文字化け

* Ubuntu の標準文字コードは、UTF-8 です。
  お使いの、MS-Windows アプリは、標準ではシフトJIS 以外では使え無いのでは(UTF-8 に対応していない)?

* 表示されている文字を見ると、エスケープ文字列( など)のように見えます。
  エスケープ(ESC)文字列は、端末で文字の色付け等に使用されるものです。
  非表示文字コード 1Bx で始めるので、こう呼ばれます。
  ただ、Ubuntu13.04 デスクトップ版で、端末から、gedit へコピペしても、
  エスケープ(ESC)文字列は表示されないのようなので、
  下記、コマンドを実行し、OSなどの詳細を掲示してください。
  詳しいレスが付くかも知れません
1: uname -a
2: dpkg -l gedit gnome-terminal
3: cat /etc/lsb-release

* web ページでは、ESC文字列は、フィルターを通りません。

オフライン

 

#3 2013-10-25 22:43:56

hito
管理者
登録日: 2007-03-18

Re: コマンドscriptのログにおける文字化け

表示されている「謎の文字」はターミナルの制御コード(色を出力するためのもの)です。で、これを文字コードの一部だとテキストエディタが誤認しているのが問題です。

トーフが表示されるのは、もともと文字コードに該当する文字が存在しない(というか、そもそも文字コードではないただのバイナリである)からです。

安全に除去する方法はあまりなく、もともと実行されていたターミナル上で、
cat hoge.log
などとして、制御文字をターミナルに解釈させるのが確実です。

……というので回答になっているでしょうか?

オフライン

 

#4 2013-10-26 10:31:43

ext-goki
新しいメンバ
登録日: 2013-10-25

Re: コマンドscriptのログにおける文字化け

siさん、hitoさん、
詳しい回答ありがとうございます。

文字コードにまつわる問題だったわけですね。
うーむ、やはりLinuxは初級者には色々と難しいんだな、
という感触を持ちました。

scriptというコマンドも
結局はterminalで記録内容を読むことを
前提として作られているということでしょうか。

結論としましては、
scriptでterminal画面の内容を自動的に記録しても、
エディタでは文字化けするし
cat や more でterminalに再表示しても
(Debianでlessを使うとまた別の文字化けが起きましたが)
terminalの表示内容全体を簡単にプリントすることはできないようですので、
プリント用にterminalの画面を記録するには
面倒くさくてもterminalから1ページずつエディタにコピペするしかないということでしょうか。
だとすれば仕方が無いですけども。

オフライン

 

#5 2013-10-26 20:31:08

si
メンバ
From: hokkaido kitami, jp
登録日: 2007-01-15

Re: コマンドscriptのログにおける文字化け

ext-goki による投稿:

s
scriptでterminal画面の内容を自動的に記録しても、
エディタでは文字化けするし

この手のファイルを読むには、非表示文字を適切に変換して表示してくれるエディタ、Vim,GVim、Emacsを使うのが良いと思います。
ESCを^[ 、CRを^M のように表示してくれます。

オフライン

 

#6 2013-10-28 08:20:05

ext-goki
新しいメンバ
登録日: 2013-10-25

Re: コマンドscriptのログにおける文字化け

siさん、レスありがとうございます。

Vim,GVim、Emacsを使っても
必要のない文字が残ってしまうので、
きれいに印刷しようと思えば、
シェルスクリプトやエディタのプラグインなどで
制御コードの文字を取り除き
空白や改行などを整形し直すのが、
可能であれば現実的かもしれません。
これはしようと思えばできるのでしょうか?

ただ、これもシェルスクリプト一発で操作が完了するのでなく
追加の手作業が必要だったりすれば、
やはりterminalから1ページずつエディタにコピペする方が
印刷用文書を作るのには簡単なようです。

オフライン

 

#7 2013-10-28 12:09:28

si
メンバ
From: hokkaido kitami, jp
登録日: 2007-01-15

Re: コマンドscriptのログにおける文字化け

ext-goki による投稿:

制御コードの文字を取り除き
空白や改行などを整形し直すのが、
可能であれば現実的かもしれません。
これはしようと思えばできるのでしょうか?

コード:

sed -e 's/\r//g' -e 's/\a//g' -e 's/\x08//g' -e 's/\x1B\[0m//g' -e 's/\x1B\[01;34m//g' typescript > noneCTRLtext

のように、sed などを使えば、文字列置換、削除できます。
(頻繁に使うようであれば、Python,Perl、Ruby 等のスクリプト言語で作っておいたほうが良いかも知れません)

コマンドライン上での、制御文字表現は
\a     警告(ベル)
\b バックスペース
\e     エスケープ文字
\f     フォームフィード文字
\n     改行文字
\r     復帰文字
\t     水平タブ文字
\v     垂直タブ文字
\\ バックスラッシュ
\’     シングルクオート
\nnn ASCIIコードの8進値がnnnである文字(1文字につき数字3けた)
\xnnn ASCIIコードの16進値がnnnである文字(1文字につき数字3けた)

らしいです。 ¥b 等の表現で、上手く削除できない場合は、¥x1B の様に、16進数表現でやれば、マッチするようです。

オフライン

 

#8 2013-10-28 18:14:39

hito
管理者
登録日: 2007-03-18

Re: コマンドscriptのログにおける文字化け

ext-goki による投稿:

やはりterminalから1ページずつエディタにコピペする方が
印刷用文書を作るのには簡単なようです。

これが何を意味するのかちょっと読めないのですが、

 ・ターミナルの設定で、バックログを無限に保存するようにする
 ・問題のscriptlogをcatする
 ・編集→すべて選択

とやってコピー&ペーストするのは面倒だ! という話でしょうか?

オフライン

 

#9 2013-10-30 02:52:17

ext-goki
新しいメンバ
登録日: 2013-10-25

Re: コマンドscriptのログにおける文字化け

siさん、hitoさん、
たびたびの回答、本当にありがとうございます。

siさんが例示して下さったコードですが、
これでトーフも取り除けるのでしょうか?
それと、\x08
が特によく分からなかったのですが、
これは 0x08(16進)の BS(後退)
と同一なのでしょうか?

hitoさんのレスを最初見たとき、
「あれ、そうやれば
 1ページずつコピペしなくても一発で操作完了するのかな?」
と思ったのでやってみました。

terminalで
編集→プロファイルの設定
スクロールタブ
スクロールバックのサイズ 「無制限にする」にチェックした上で

いくつかのコマンドを実行してスクロールして行っている状態では
ちゃんとスクロールタブが表示され
編集→すべて選択、コピー&ペースト
によって、ディスプレイ外にスクロールアウトした部分まで
全てエディタに貼り付けることができますが

catで表示させたmanual pageのログファイルを同じ手順で
コピー&ペーストしようとしても、
catコマンドを使った時点でスクロールタブが消えてしまい
ディスプレイ内に表示されている部分しかエディタに貼り付きません。

さらに、scriptでログを取る時に、
manual page の場合は
最後にqを押してmanualを一旦終了してから
元のコマンド入力モードに戻ったところまで含まれている
ログファイルをcatで表示させようとすると、
manual pageの部分は一瞬で表示されて消え去り
terminalの画面に残らずコピー&ペーストしようがない、
というおかしな現象も起きました。
(manual page でqを押す前にterminalを強制終了させて作成されたログファイルであれば、少なくとも見える範囲はterminalの画面に残ってくれます)

と、いうことでしたので
バックログを無限に保存しても一発で操作完了できませんでした。

・・・・・

と書き進んできたあたりで、
Googleで「man txt 変換」を検索にかけてみたら
自分がやりたかったことの
解決策がすぐに見つかりました。
例えば、catであれば

man cat | col -b > cat.txt

とすればmanual pageの綺麗なtxtファイルが一発で作成されるとのことでした。
初級者にはありがちなことかもしれません。

scriptにより一旦テキスト形式のファイルが生成されてしまえば
terminalで元々行っていた操作は関係ないだろうと思っていたのですが、
manのコマンドを使うと一般の場合と違ってくるようです。
制御文字が特殊なのでしょうか・・・
主にmanual pageを印刷したかったことを最初からきっちり書いておかなかったために
こちらの特殊な状況が分かりにくかったようで、
どうも申し訳ありませんでした。

オフライン

 

#10 2013-10-30 10:31:27

si
メンバ
From: hokkaido kitami, jp
登録日: 2007-01-15

Re: コマンドscriptのログにおける文字化け

ext-goki による投稿:

これでトーフも取り除けるのでしょうか? それと、\x08 が特によく分からなかったのですが、これは 0x08(16進)の BS(後退)と同一なのでしょうか?

多分、「トーフ」を、拡大してみると、四角い枠の中に、ESC文字コードの、001b が書かれていると思います。
\x08 は、BSの文字コードです。
制御(非表示)文字コードは、「 hexdump 」 コマンドで、16進表示させたり、オプション -c を付け、文字表示にしたりしすれば、確認できます。

ext-goki による投稿:

catで表示させたmanual pageのログファイルを同じ手順で
コピー&ペーストしようとしても、
catコマンドを使った時点でスクロールタブが消えてしまい
ディスプレイ内に表示されている部分しかエディタに貼り付きません。

cat typescript | more
とすれば、表示を止められます。
(スペースで、ページ送り、下向き矢印で、行送り)

> manual pageを印刷したかった
多くのマニュアルが、ネット上にもあります。
「 manpege *** 」 で、検索してみてください。

オフライン

 

#11 2013-11-02 09:29:51

ext-goki
新しいメンバ
登録日: 2013-10-25

Re: コマンドscriptのログにおける文字化け

siさん、ご教示ありがとうございます。

manual pageはウェブにも置いてあるのですね。

cat typescript | more
は言われてみれば確かにその通りですね。
経験を積んでいって
こういうことはすぐ気づけるように早くなりたいものです。

hexdumpはウェブでの情報を見ても
初級者には難しいなという印象で
すぐには使いこなせそうにないです。
一昨日からプリンタのインクが切れていることもありまして、
結局まだじっくり取り組めていません。

時間が取れて少し理解が進んだら
また質問させていただきますので、
その時にはどうぞよろしくお願いします。

オフライン

 

Board footer

Powered by FluxBB