検証環境

Windows10 64bit

方法

input.txt からBOMを取り除いて、 out.txt テキストを出力する場合

1
2
start /min /wait cmd /c chcp 65001 ^& cmd /u /c type input.txt ^> $$$ ^& cmd /c type $$$ ^> out.txt ^& del $$$

コマンド自体は参考にしたところのほぼコピーですが、参照元には解説がなかったので分かる範囲で解説します。

解説

まずは各コマンドや引数を/?などで確認

  • start /min /wait外部プロセスでコマンドを起動(start)。ウィンドウを最小化(/min)、実行が終わるまで待つ(/wait)。
  • cmd /c コマンドプロンプトを起動し、引数に渡された文字列のコマンドを実行し終了する(/c)。
    • &はコマンドの実行が終わったら次のコマンドを実行するの意味。bashで言うところの ;
    • ^はコマンドプロンプトのエスケープシーケンス
    • ^& はエスケープされて文字列になった&
    • ^>はエスケープされて文字列になった>
  • chcp 65001 コマンドプロンプトの文字コードをUTF-8に変更する。(デフォルトはShiftJIS)
  • cmd /uは、内部コマンドの出力結果Unicodeパイプまたはファイルに出力するオプション
    • デフォルトは/a(ANSI)
  • typeコマンドはテキストファイルの内容を出力する内部コマンド
    • catみたいなもの
    • ShiftJISでもUTF-8でもUnicodeでも何でも読めるみたい

まとめるとこんなステップになります。

  • コンソールの文字コードをUTF-8にする
  • Unicodeのモードでinput.txtを開き、$$$に保存
    • $$$ファイルは「BOM付きUnicode」になる
  • ANSIのモードで$$$を開き、out.txtに保存
    • ANSIのモードではBOMが付かないため、BOMが外れる(現象からの予想)
    • out.txtは「BOMなしUTF-8」になる
  • $$$ファイルを削除

ANSIのコマンドプロンプトでUTF-8のファイルをtypeしてリダイレクトしてもBOMは外れない模様。 (文字コードが同じだから変換が発生しない?) なので、一旦unicodeを経由して変換することで無理やりBOMを取り外してるみたい。

参考