Default PowerShell untuk memancarkan UTF-8, bukan UTF-16?

31

Secara default, PowerShell di Windows tampaknya mengeluarkan UTF-16 (misalnya, jika saya melakukan yang sederhana echo hello > hi.txt, kemudian hi.txtberakhir di UTF-16). Saya tahu bahwa saya bisa memaksakan ini pada penyandian teks yang saya inginkan dengan melakukan echo hello | out-file -encoding utf8 hi.txt, tetapi yang saya inginkan adalah menjadi default ketika saya menggunakan operator redirection. Apakah ada cara untuk mencapai hal ini?

Benjamin Pollack
sumber
1
terima kasih atas tip untuk alternatif, melakukan ini dari terminal bisa lebih cepat daripada editor teks kadang-kadang.
Todd Partridge
Di Powershell 6.0, ini telah dianggap tidak perlu - Powershell sekarang default ke UTF-8 tanpa pengkodean untuk pengalihan. Lihat github.com/PowerShell/PowerShell/issues/4878
kumarharsh

Jawaban:

21

Menggunakan dekompiler .NET pada System.Management.Automation assembly (alias "Microsoft Windows PowerShell Engine Core Assembly") mengungkapkan fragmen kode ini:

// class: System.Management.Automation.RedirectionNode
private PipelineProcessor BuildRedirectionPipeline(string path, ExecutionContext context)
{
    CommandProcessorBase commandProcessorBase = context.CreateCommand("out-file");
    commandProcessorBase.AddParameter("-encoding", "unicode");
    if (this.Appending)
    {
        commandProcessorBase.AddParameter("-append", true);
    }
    commandProcessorBase.AddParameter("-filepath", path);
    ...

Jadi, itu terlihat sangat sulit bagi saya.

FYI, ini pada sistem Windows 7 Enterprise x64 dengan PowerShell 2.0 diinstal.

Tinister
sumber
5
Masih sulit dikodekan di PowerShell 5 pada Windows 10, sayangnya:CommandParameterInternal.CreateParameterWithArgument(PositionUtilities.EmptyExtent, "Encoding", "-Encoding:", PositionUtilities.EmptyExtent, "Unicode", false, false);
Artfunkel
3

Tidak yakin apakah ini akan melakukan apa yang Anda cari, tetapi Anda dapat mencoba mengatur variabel lingkungan seperti yang disebutkan di sini

$OutputEncoding = New-Object -typename System.Text.UTF8Encoding
Serigala tua
sumber
2
Saya kira tidak $OutputEncodingcukup yang saya butuhkan; yang diatur ke ASCII di PowerShell, dan memengaruhi cara hal-hal ditampilkan . Yang ingin saya lakukan adalah mengubah format teks yang disimpan dalam file, yang (AFAICT) berbeda dari $OutputEncodingkontrol apa .
Benjamin Pollack