convmvコマンドによる文字コード変換でエラー発生に関して

コメント

7件のコメント

  • 正式なコメント
    Ichiro Takahashi

    フィックスポイントの高橋と申します。

    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

    参考になさってみてください。

    コメントアクション Permalink
  • kawabata

    五月雨になりまして申し訳ございません。

    追加で可能であれば教えていただきたいのですが、

    zip圧縮した日本語名のファイルをWindows端末で

    解凍したときに文字化けしない圧縮方法は無いでしょうか。

    0
    コメントアクション Permalink
  • Ichiro Takahashi

    追加で調査をしていたところ、convmv コマンドを実行するときに変換後のファイルがすでに存在しているような状況では kompira が別のエラーを発生することがある、という問題が発覚しました。こちらは kompira の不具合である可能性がありますので、別途調査と対策を検討いたします。

    0
    コメントアクション Permalink
  • kawabata

    ご回答有り難うございます。

    1度成功したあと、再度エラーが発生したため調査のため、お礼が遅くなりました。

    変換後ファイルを削除することで、再処理処理可能なようなことは確認できました。

    次にzip圧縮するとき変換後ファイルを削除してしまうことで、エラーを回避して使用することにします。

    (変換後ファイルがすでにあると、出力にメッセージ「exists and differs or --replace option missing - skipped」が追加されているようです)

    調査と対策頑張ってください。

     

    以上、ありがとうございました。

    0
    コメントアクション Permalink
  • kawabata

    無事、作成したファイルを圧縮しメールに添付して、Windows端末側で文字化けなく解凍できるようになりました。

    追加で教えていただきたいことがあります。

    お手数ですがご回答お願いします。

    質問:__raw_stdout__ のような制御変数の一覧を記載したwebページがあれば教えてください。

    「Kompira 1.6.1.post3 ドキュメント」の4.4.3.2. 制御変数に一部の制御変数が記載されておりましたが、__raw_stdout__の説明が見つけられませんでした。

     

    以上、よろしくおねがいします。

    0
    コメントアクション Permalink
  • Ichiro Takahashi

    質問:__raw_stdout__ のような制御変数の一覧を記載したwebページがあれば教えてください。

    申し訳ありません、v1.6 で追加になった制御変数についてドキュメントの更新が追い付いていない部分があり記載がございません。以下を参考になさってください。

    • __raw_stdout__: true にするとリモートコマンドの標準出力をバイナリで受け取る
    • __raw_stderr__: true にするとリモートコマンドの標準エラー出力をバイナリで受け取る

    なお、今回、標準エラー出力がバイナリの場合にプロセスが正常に完了しない場合がある、という不具合が見つかりましたので、こちらにつきましては次回以降のリリースで修正するようにいたします。

    0
    コメントアクション Permalink
  • kawabata

    ご確認ありがとうございます。

    convmvtコマンドやzipコマンド等の出力にsjis文字コードが入る処理は、

    __raw_stderr__ を追加した下記のブロック内で処理することにします。

    { __raw_stdout__ = true , __raw_stderr__ = true |
     <処理>
    }

     

    ご回答ありがとうございました。

    0
    コメントアクション Permalink

サインインしてコメントを残してください。