PowerShellのデフォルトの出力エンコーディングをUTF-8に変更する


110

既定では、コマンドの出力をファイルにリダイレクトするか、PowerShellの他の場所にパイプ処理する場合、エンコードはUTF-16であり、これは役に立ちません。UTF-8に変更したいと思っています。

>foo.txt構文をに置き換えることでケースバイケースで実行できますが| out-file foo.txt -encoding utf8、毎回繰り返す必要があるのは厄介です。

PowerShellで設定する永続的な方法は、それらを\Users\me\Documents\WindowsPowerShell\profile.ps1;に配置することです。このファイルが実際に起動時に実行されることを確認しました。

出力エンコーディングはで設定できると言われています$PSDefaultParameterValues = @{'Out-File:Encoding' = 'utf8'}が、試してみましたが効果がありませんでした。

https://blogs.msdn.microsoft.com/powershell/2006/12/11/outputencoding-to-the-rescue/について語った$OutputEncodingことは、関連するべきであるかのように一見見えますが、それは出力がエンコードされている語りますASCIIで、これは実際に起こっていることではありません。

UTF-8を使用するようにPowerShellをどのように設定しますか?

回答:


170

注:以下はWindowsPowerShellに適用されます
参照してください。次のセクションで、クロスプラットフォームのためのPowerShellコア(V6 +)版。

  • オンPSv5.1以上>かつ>>効果的の別名であるOut-Fileあなたがすることができ、デフォルトのエンコーディングを設定するための>/ >>/Out-File経由で$PSDefaultParameterValues設定変数

    • $PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
  • PSv5.0以下、あなたがすることができないのエンコードを変更>/>>、しかし、上PSV3以上、上記の技術ではありませんへの明示的な呼び出しのための作業をOut-File
    $PSDefaultParameterValues設定変数はPSv3.0で導入されました)。

  • オンPSv3.0以上、あなたがしたい場合のためにエンコードするデフォルト設定のすべてのサポートのコマンドレットのパラメーターを
    -Encoding
    (PSv5.1 +に含まれている>>>)、使用:

    • $PSDefaultParameterValues['*:Encoding'] = 'utf8'

あなたはあなたの中にこのコマンドを配置する場合$PROFILEなど、コマンドレットなどOut-FileSet-Content、これはそれ作ることをデフォルトでエンコードUTF-8が、ノートを使用するセッション・グローバル設定明示的にエンコーディングを指定していないすべてのコマンド/スクリプトに影響を与えます。

同様に、同じように動作させたいスクリプトまたはモジュールにそのようなコマンドを含めるようにしてください。そうすれば、別のユーザーや別のマシンで実行した場合でも、実際に同じように動作します。

警告PowerShellは、V5.1のように、必ず_with UTF-8のファイルを作成します(擬似)BOM_だけでは通例である、のWindowsの世界- Unixのユーティリティは、このBOMを(下参照)を認識しないベース。BOMのないUTF-8ファイルを作成する回避策については、この投稿を参照してください。

以下のためのWindows PowerShellコマンドレットの標準の多くの間で乱暴に矛盾するデフォルトの文字エンコーディングの動作の概要、下のセクションを参照してください。


自動$OutputEncoding変数は無関係であり、PowerShellが外部プログラムと通信する方法(PowerShellが文字列を送信するときに使用するエンコード)にのみ適用されます。出力リダイレクト演算子とPowerShellコマンドレットがファイルに保存するために使用するエンコードとは関係ありません。


オプションの読み物:クロスプラットフォームの観点:PowerShellコア

PowerShellはPowerShell Coreエディションを介してクロスプラットフォームになりました。そのエンコーディングは、Unixライクなプラットフォームに沿って、デフォルトでBOMのないUTF-8になっています。

  • これは、BOMなしのソースコードファイルはUTF-8であると仮定されていることを意味し、使用>/ Out-File/Set-ContentデフォルトBOMなしUTF-8。utf8 -Encoding引数を明示的に使用しても、BOMのないUTF-8が作成されますが、値を使用て疑似BOMを使用してファイルを作成することを選択できますutf8bom

  • UnixライクなプラットフォームのエディターでPowerShellスクリプトを作成し、最近ではVisual StudioCodeやSublimeTextなどのクロスプラットフォームエディターを使用するWindowsでも、結果の*.ps1ファイルには通常UTF-8疑似BOMがありません

    • これは、PowerShellの上正常に動作コアを
    • ファイルに非ASCII文字が含まれている場合、WindowsPowerShellで破損する可能性があります。スクリプトで非ASCII文字を使用する必要がある場合は、BOMを使用してUTF-8として保存します。
      BOMがない場合、Windows PowerShellは、スクリプトを従来の「ANSI」コードページ(Unicode以前のアプリケーションのシステムロケールによって決定されます。たとえば、米国英語システムのWindows-1252)でエンコードされていると(誤って)解釈します。
  • 逆に、ファイルませんが、 UTF-8の疑似BOMが上問題となる可能性が持っているUnixライクなプラットフォームとして、彼らのようなUnixユーティリティ原因catsedawk-とのような、さらにいくつかのエディタgedit-するを通じて疑似BOMを渡すすなわち、データとして扱います

    • これは常に問題になるとは限りませbash、たとえば、text=$(cat file)またはを使用してファイルを文字列に読み込もうとした場合など、問題になる可能性がありtext=$(<file)ます。結果の変数には、最初の3バイトとして疑似BOMが含まれます。

Windows PowerShellでの一貫性のないデフォルトのエンコード動作:

残念ながら、WindowsPowerShellで使用されるデフォルトの文字エンコードは非常に一貫性がありません。前のセクションで説明したように、クロスプラットフォームのPowerShell Coreエディションは、これを称賛に値する形で終わらせました。

注意:

  • 以下は、すべての標準コマンドレットを網羅することを目的としたものではありません。

  • 彼らのヘルプトピックを見つけるために、コマンドレットの名前をグーグルでは、今、あなたのPowerShellを示すコア・デフォルトで話題のバージョンを。左側のトピックのリストの上にあるバージョンドロップダウンリストを使用して、WindowsPowerShellバージョンに切り替えます。

  • この記事の執筆時点で、ドキュメントには、ASCIIがWindowsPowerShellのデフォルトのエンコーディングであると誤って記載されていることがよくあります。このGitHubドキュメントの問題を参照してください。


書くコマンドレット:

Out-Fileおよび>/ >>「Unicode」を作成します-UTF-16LE-デフォルトでファイル-すべてのASCII範囲の文字(あまりにも)は2バイトで表されます-これはSet-Content/とは著しく異なりますAdd-Content(次のポイントを参照)。New-ModuleManifestそしてExport-CliXmlまた、UTF-16LEファイルを作成します。

Set-ContentAdd-Contentファイルがまだ存在しない/空の場合)ANSIエンコーディング(PowerShellが呼び出すアクティブなシステムロケールのANSIレガシーコードページで指定されたエンコーディング)を使用しますDefault

Export-Csv文書化されているように、実際にASCIIファイルを作成しますが、-Append以下の注を参照してください。

Export-PSSession デフォルトでBOMを使用してUTF-8ファイルを作成します。

New-Item -Type File -Value 現在、BOMなし(!)のUTF-8を作成しています。

Send-MailMessageヘルプトピックは、そのASCIIエンコーディングがデフォルトであると主張-私は個人的に請求することを確認していません。

Start-Transcript 常にBOMを使用してUTF-8ファイル作成します-Append以下の注を参照してください。

既存のファイルに追加するコマンドを再実行します。

>>/Out-File -Append作らない何のファイルのエンコーディングの一致する試み既存のコンテンツを。つまり-Encoding、オプションではない、で特に指示されない限り、デフォルトのエンコーディングを盲目的に適用します>>$PSDefaultParameterValues上記のように、PSv5.1 +で間接的にを除いて)。つまり、既存のファイルのコンテンツのエンコーディングを知っており、同じエンコーディングを使用して追加する必要があります。

Add-Content称賛に値する例外です。明示的な-Encoding引数がない場合、既存のエンコーディングを検出し、それを新しいコンテンツに自動的に適用します。ありがとう、js2010。これは、Windows PowerShellでは、既存のコンテンツにBOMがない場合に適用されるのはANSIエンコーディングであるのに対し、PowerShellCoreではUTF-8であることを意味します。

Out-File -Append/>>との間のこの不一致はAdd-Content、PowerShell Coreにも影響しますが、このGitHubの問題で説明されています

Export-Csv -Append 既存のエンコーディングと部分的に一致します。既存のファイルのエンコーディングがASCII / UTF-8 / ANSIのいずれかである場合、UTF-8を盲目的に追加しますが、UTF-16LEおよびUTF-16BEと正しく一致します。
別の言い方をすれば、BOMがない場合、Export-Csv -AppendUTF-8がそうであるAdd-Contentと仮定しますが、ANSIを仮定します。

Start-Transcript -Append 部分的には、既存のエンコーディングに一致します。それは正しくエンコーディングに一致するBOMではなく、潜在的に非可逆ASCIIへのデフォルトは1が存在しない場合にエンコードします。


読み取るコマンドレット(つまり、BOMない場合に使用されるエンコーディング):

Get-ContentおよびImport-PowerShellDataFileANSI(をデフォルトDefaultと一致しています)、 Set-Content
ANSIは、PowerShellエンジン自体がファイルからソースコードを読み取るときにデフォルトで設定されるものでもあります。

これとは対照的に、Import-CsvImport-CliXmlおよびSelect-StringUTF-8 BOMが存在しない場合には想定しています。


1
Win10でBOMを追加しないように強制する方法はありますか?
mvorisek

2
私は、@EliaWeissを反対していないが、それは特にWindows PowerShellのだ、と彼らは最終的には右のPowerShellでそれを手に入れたコア
mklement0

2
@Marc:VS Codeやその他の最新のクロスプラットフォームエディターは、称賛に値するデフォルトでUTF-8に設定されています。これは、ANSIでエンコードされたファイルを誤って解釈することを意味します。メモ帳は、ヒューリスティックを使用してエンコーディングを推測します。重要なのは、UTF-8でエンコードされたファイルも技術的に有効なANSIでエンコードされたファイルであるため、これは推測にすぎないということです(ただし、その逆はありません)。UnixライクなプラットフォームのようにBOMがない場合にWindowsのすべてがデフォルトでUTF-8に設定されていれば素晴らしいのですが、そうではありません。特にWindows PowerShellの場合はそうではありませんが、幸いなことにPowerShellCoreの場合はそうです。
mklement0

2
現在の値があればそれを監視するには、次のように入力します$PSDefaultParameterValues
Sandburg

1
@ not2qubit:chcpレポートの内容は[Console]::InputEncoding。のみに依存します。.NETはエンコーディングをキャッシュしているため、PowerShellの内部chcp.comからは使用できませんが、で使用することはできます。この場合、後でPowerShellを起動する場合にも効果的です。cmd.exe
mklement0

2

簡単に言うと、次を使用します。

write-output "your text" | out-file -append -encoding utf8 "filename"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.