Windows CMD と PowerShell のリダイレクトとテキスト エンコーディングの違いは何ですか?

Windows CMD と PowerShell のリダイレクトとテキスト エンコーディングの違いは何ですか?

確かに、これは素晴らしいタイトルではありませんが、正直に言うと、エッセイを質問として投稿せずに質問をどのように表現したらよいかわかりませんでした。この説明で、質問に肉付けする必要があります。

問題:

私は Windows で Python 2.7 を使用して実行する Python スクリプト (私が作成したものではありません) を持っています。これは比較的基本的なもので、さまざまなソースから情報を抽出し、その出力を端末に PRINT します。この出力の一部には非 ASCII 文字セットの文字が使用されており、ここからが楽しい作業の始まりです。

Python スクリプトはターミナルで正常に実行され、画面に出力されましたが、ファイル リダイレクトを追加するとすぐにエラーが発生し、Python スクリプトがクラッシュしました。徹底的に調査した結果、これは Python 2.7 が Unicode を処理する方法に原因があるようで、Python 用の Windows 環境変数を設定することでこれを回避しました。これは次のとおりです。

$env:PYTHONIOENCODING="UTF-8"

PowerShellでは、

Set PYTHONIOENCODING="UTF-8"

CMD で。

これで、Python スクリプトの出力をクラッシュせずにファイルにリダイレクトできるようになりました。問題は、2 つの環境で結果が異なることです。Python スクリプトを実行するための基本的な形式は次のとおりです。

python pythonscript.py parm1 > test.txt

これは CMD と PowerShell の両方で機能しますが、最終的には異なるエンコードと文字を含むファイルが作成されます。たとえば、問題の原因となる文字は ですø。上記の行を CMD で実行すると、結果のファイルは としてエンコードされUTF-8、この文字が正しく表示されます。PowerShell で同じコマンドを実行すると、ファイルは としてエンコードされUCS-2 LE BOM(NotePad++ で表示されるように)、上記の文字は実際には 2 つの文字 として表示されます├©

さらに奇妙なことに、どちらの環境でもリダイレクトしない場合 (つまり、ターミナルに PRINT するだけの場合)、どちらも間違った文字が表示されます。

また、Out-file CmdLet への PowerShell パイプも試してみました。

python pythonscript.py parm1 | out-file -encoding UTF8 test.txt

この結果、ファイルは としてエンコードされますがUTF-8-BOM、それでも間違った文字が表示されます。ここでさまざまなエンコード タイプを試しましたが、ファイルのエンコードと文字が異なり、正しいものは何もないようです。

また、 を実行して両方の環境のコード ページを確認しましたchcp。どちらの場合も、 が返されます。PowerShell を のコード ページ( )Active code page: 850に設定しようとしましたが、違いはありませんでした。65001utf-8

だから、私は完全に混乱しています。

関連情報