n-Archives.net

Robocopyのログ出力の文字コードについて調べてみた

目次

/UNICODE, /UNILOG, /LOG オプションが出力する文字コードの調査結果について

別の記事 「Robocopyを英語表示にしてログ表示の桁ずれをなくす」 の中で、コードページをUTF8にして、Robocopyを英語表記にするという記事を書きました。その際、コードページをUTF8にしても、日本語ファイル名や年月日を正しく表示できる方法がないか、いろいろと試行錯誤をしました。

 

 /UNICODE、/UNILOG、/LOGなどのログ関連のオプションが指定された時、どのような文字コードが出力されているか、また、コードページがshift_jisの場合とUTF8の場合それぞれについてどうか、について実際に実験してみたので、その結果を以下にまとめます。

 

動作異常の例

結果をご覧いただく前に、少しだけ、Robocopyのログ出力における文字コードの問題の深刻さについて少し説明しておきたいと思います。

今回の調査にあたっては、特に、UNICODE系のオプションについて、明らかにおかしい動作が見られたので、そのあたりを中心に調べています。

これは /UNICODE の実行例です。

最初にUTF-16のBOMを付けているにもかかわらず、本文ほぼ全体がUTF-16で決められた2バイト単位のコードになっていません。年月日やファイル名は全てUTF-8になっています。不思議なことに、Option文字列を表示している箇所のみ、本来のUTF-16の2バイト単位のコードになっています。全く不整合だらけで、ひどい状況です。

 

調査結果

各ログ出力コマンドについて、out.log ファイルに出力される文字コードを調べた結果を以下にまとめました。表の緑色の部分は、出力の文字コードが一貫していて正常だと思われる部分です。

Robocopyのログ出力における文字コード対応状況(個人調べ)
 ログ出力コマンド コードページ: shift_jis (932)
(robocopyは日本語表示)
コードページ: UTF8 (65001)
(robocopyは英語表示)
BOM 出力コード状況 正常性 BOM 出力コード状況 正常性
robocopy  > out.log 無し shift_jis 無し ファイル名:shift_jis 年月日の文字:UTF8 ×
robocopy  /UNICODE > out.log UTF16
(FF FE)
shift_jis (Option部分のみUTF-16) × (BOMとコードが合ってない) UTF16
(FF FE)
UTF-8 (Option部分のみUTF-16) × (BOMとコードが合ってない)
robocopy  /UNILOG:out.log UTF16
(FF FE)
UTF-16 UTF16
(FF FE)
UTF-16
robocopy  /UNILOG+:out.log 無し shift_jis 〇 (Unicodeになっていない) 無し ASCII文字しか表示されない。日本語文字が削除されている。 ×
robocopy  /UNILOG:NUL /TEE > out.log  無し shift_jis 〇 (Unicodeになっていない) 無し UTF-8
robocopy  /UNILOG+:NUL /TEE > out.log  無し shift_jis 〇 (Unicodeになっていない) 無し UTF-8
robocopy  /LOG:out.log 無し shift_jis 無し ファイル名:shift_jis
年月日の文字が削除されている
×
robocopy  /LOG+:out.log 無し shift_jis 無し ファイル名:shift_jis
年月日の文字が削除されている
×
robocopy  /LOG:NUL /TEE > out.log  無し shift_jis 無し ファイル名:shift_jis
年月日の文字:UTF8
×
robocopy  /LOG+:NUL /TEE > out.log  無し shift_jis 無し ファイル名:shift_jis
年月日の文字:UTF8
×

結果からわかること

分かったことを簡潔にまとめると以下の通りです。

  • /UNICODE は役に立たない。使うべきではない。
  • /UNILOG:<logfile> は正しく動作し、UTF-16 (BOM付き) で出力される。
  • /UNILOG+ は使う意味がない。 /UNILOG と出力内容が全く異なる。
  • /LOG は日本語環境(コードページ shift_jis 932)であれば正しく動作する。
  • UTF-8環境(コードページ 65001) で唯一正しく動作するのは "/UNILOG:NUL /TEE" だけ

 

まず、全体として、UNICODE系のオプションの動作はとてもおかしいです。冒頭で説明したように、特に、/UNICODE オプションは、文字コードが混在するなど、動作が明らかにおかしいです。/UNICODE は使うべきではないと思われます。

 

/UNILOG:<logfile> については、正常に UTF-16で出力されています。ただ、今どき、UTF-16でファイルを作成したいと思うことはあまりないのではないかと思われ、使われるケースは少ないのではないかと思います。

 

また、/UNILOG+ についても動作が全くおかしく、使用するべきではなさそうです。そもそも、/UNILOG と /UNILOG+でこんなに挙動が異なるというのも不思議です。

 

次に、コードページをUTF8にした場合ですが、これについても全体的に挙動はおかしくなります。唯一、 "/UNILOG:NUL /TEE" オプションを付けた場合のみ、正しくUTF-8(BOM無し)で出力できているようです。従って、Robocopyを正しく英語表記にするためには、「コードページ UTF8 + "/UNILOG:NUL /TEE"オプション」 と設定する必要があります。

 

/LOG オプションについては、コードページ shift_jis (932) では正しく動作しています。コードページ UTF8(65001)では正しく動作しません。

 

結論

通常使っている分には、以下のポイントだけ覚えておけばよいのではないでしょうか。

  • 日本語環境で使用する場合、使えるのは /LOG, /LOG+オプションだけ。(/UNICODE, /UNILOG, /UNILOG+は使わない)
  • Robocopyを英語表記にしたければ、「コードページ UTF8 + "/UNILOG:NUL /TEE"オプション」 とする。

 

 



【関連記事・関連コンテンツ】

 

コメントをお送りください
お名前:
コメント:
コメントの公開: