convmvコマンドによる文字コード変換でエラー発生に関して
はじめまして、河端と申します。よろしくおねがいします。
目的:zip圧縮した日本語名のファイルがWindows端末で解凍すると文字化けする対応
ファイル名の文字化けを解消するため、convmvコマンドを使用してutf8からsjisへ
文字コード変換をしたところ、エラーが発生しました。ご確認をお願いします。
・ソース
- ["cat > '/tmp/kompira/データ.txt' " << 'テストファイル内容'] ->
- ["convmv -r -f utf8 -t sjis '/tmp/kompira/データ.txt' --notest"] =>
・ERROR
$ERROR = '<class \'invoke.exceptions.ThreadException\'>: \nSaw 2 exceptions within threads (UnicodeDecodeError, UnicodeDecodeError):\n\n\nThread args: {\'kwargs\': {\'buffer_\': [],\n \'hide\': False,\n \'output\': <kompira_jobmngr.worker_io.OutputStringIO object at 0x7f6f241e4318>},\n \'name\': \'handle_stdout\',\n \'target\': <bound method RunnerPatch.handle_stdout of <kompira_jobmngr.drivers.invoke.runner.InvokeRunner object at 0x7f6f261ed978>>}\n\nTraceback (most recent call last):\n\n File "/opt/kompira/lib64/python3.6/site-packages/invoke/util.py", line 233, in run\n super(ExceptionHandlingThread, self).run()\n\n File "/usr/lib64/python3.6/threading.py", line 864, in run\n self._target(*self._args, **self._kwargs)\n\n File "kompira_jobmngr/drivers/invoke/runner_patch.py", line 488, in handle_stdout\n\n File "kompira_jobmngr/drivers/invoke/runner_patch.py", line 244, in _handle_output\n\n File "kompira_jobmngr/drivers/base/connection.py", line 108, in decode\n\nUnicodeDecodeError: \'utf-8\' codec can\'t decode byte 0x83 in position 46: invalid start byte\n\n\nThread args: {\'kwargs\': {\'buffer_\': [],\n \'hide\': False,\n \'output\': <kompira_jobmngr.worker_io.OutputStringIO object at 0x7f6f241e45e8>},\n \'name\': \'handle_stderr\',\n \'target\': <bound method RunnerPatch.handle_stderr of <kompira_jobmngr.drivers.invoke.runner.InvokeRunner object at 0x7f6f261ed978>>}\n\nTraceback (most recent call last):\n\n File "/opt/kompira/lib64/python3.6/site-packages/invoke/util.py", line 233, in run\n super(ExceptionHandlingThread, self).run()\n\n File "/usr/lib64/python3.6/threading.py", line 864, in run\n self._target(*self._args, **self._kwargs)\n\n File "kompira_jobmngr/drivers/invoke/runner_patch.py", line 492, in handle_stderr\n\n File "kompira_jobmngr/drivers/invoke/runner_patch.py", line 244, in _handle_output\n\n File "kompira_jobmngr/drivers/base/connection.py", line 108, in decode\n\nUnicodeDecodeError: \'utf-8\' codec can\'t decode byte 0x83 in position 0: invalid start byte\n\n'
・状況
・文字コード変換後のファイルは作成されています
・'=>'で処理しているが、処理継続しません
・半角英数のファイル名だとエラーが出ない
・変換後のsjis名ファイルがある状態で["ls /tmp/kompira/"]を処理すると同様にエラーが出る
・convmvの出力にsjisが入っているためのエラーかも?(推測)
・環境
OS: CentOS Linux release 7.9.2009 (Core)
kompira: 1.6.1.post3
convmv: 1.15(2.el7)
以上、よろしくおねがいします。
-
正式なコメント
フィックスポイントの高橋と申します。
Kompira でのコマンド実行において、その標準出力は文字列であること、ローカル実行ではエンコーディングは UTF-8 であること、が前提になっています。
convmv コマンドを Kompira サーバにインストールして日本語ファイル名を変換するような実行してみたところ、その出力に UTF-8 と SJIS のエンコードが混在しているようで、これは文字列として正しく扱うことができません。
ここで、__raw_stdout__ という制御変数と true にすると、標準出力を文字列ではなくバイナリのまま扱うことができますので、たとえば以下のようにすることでエラーを回避することはできるかと思います。
|tmpfile = '/tmp/日本語ファイル.txt'|
["touch $tmpfile"] ->
{ __raw_stdout__ = true |
["convmv -r -f utf8 -t sjis '$tmpfile' --notest"]
} ->
["ls -l -b /tmp"]ちなみに、最後の ls コマンドについては -b オプションを付けることで、表示できない文字が以下のようにエスケープされるようになりエラーを回避しています(__raw_stdout__ = true で実行するのも有効かと重いんす)。
-rw-rw-rw-. 1 kompira kompira 0 1月 26 13:08 \223\372\226{\214\352\203t\203@\203C\203\213.txt参考になさってみてください。
コメントアクション -
質問:__raw_stdout__ のような制御変数の一覧を記載したwebページがあれば教えてください。
申し訳ありません、v1.6 で追加になった制御変数についてドキュメントの更新が追い付いていない部分があり記載がございません。以下を参考になさってください。
- __raw_stdout__: true にするとリモートコマンドの標準出力をバイナリで受け取る
- __raw_stderr__: true にするとリモートコマンドの標準エラー出力をバイナリで受け取る
なお、今回、標準エラー出力がバイナリの場合にプロセスが正常に完了しない場合がある、という不具合が見つかりましたので、こちらにつきましては次回以降のリリースで修正するようにいたします。
サインインしてコメントを残してください。
コメント
7件のコメント