Isu pengekodan output dalam PowerShell dan utiliti pihak ketiga yang dijalankan dalam PowerShell (SOLVED)


Pengekodan yang digunakan dalam PowerShell secara lalai. Bagaimana untuk menukar pengekodan output lalai kepada UTF-8 dalam PowerShell

Jika anda menjalankan arahan berikut dalam PowerShell 5:

"Testing" > test.file

Dan semak pengekodan dalam test.file yang baru dibuat, ternyata ia adalah UTF-16LE.

Jika anda menjalankan arahan berikut dalam PowerShell 7:

"Testing" > test.file

Dan semak pengekodan dalam test.file yang baru dibuat, ternyata ia adalah UTF-8.

Perintah berikut, dilaksanakan dalam PowerShell 5:

.\mysqldump.exe -u root --all-databases > all-databases_ps5.sql

Mencipta fail UTF-16LE berkod all-databases_ps5.sql yang mana semua pangkalan data MySQL akan dieksport menggunakan mysqldump (untuk tujuan sandaran). Dalam pangkalan data ini, SEMUA aksara bukan Latin akan rosak secara tidak dapat dipulihkan!

Iaitu, bukannya Cyrillic, ia akan menjadi seperti ini:

'╨Р╤А╨▒╨╕╤В╤А╨░╨╢╨╜╤Л╨╣ ╨┐╤А╨╛╤Ж╨╡╨╢╨╜╤Л╨╣ ╨┐╤А╨╛╤Ж╨╡╨╢╨╡╤ББ: ╨╡╤ББ ▒╨╜╨╕ ╨║/╨Ъ.╨Ь. ╨Р╤А╤Б╨╗╨░╨╜╨╛╨▓, ╨Ф.╨е. ╨Т╨░╨╗╨╡╨╡╨▓, ╨а.╨Э. ╨У╨╕╨╝╨░╨╖╨

Perintah berikut, dilaksanakan dalam PowerShell 7:

.\mysqldump.exe -u root --all-databases > all-databases_ps7.sql

Mencipta fail UTF-8 all-databases_ps7.sql yang dikodkan di mana semua pangkalan data MySQL akan dieksport menggunakan mysqldump (untuk tujuan sandaran). Tetapi dalam pangkalan data ini, SEMUA aksara bukan Latin akan rosak dengan tidak dapat dipulihkan LAGI!

Iaitu, nampaknya pengekodan lalai telah berubah kepada UTF-8, tetapi masalah dengan sandaran pangkalan data yang rosak sepenuhnya tidak hilang.

Cara menyimpan output daripada program pihak ketiga dalam pengekodan UTF-8 dalam PowerShell

Tingkah laku di atas, yang merosakkan output arahan dalam PowerShell, tidak boleh diterima. Mari lihat cara memastikan output dalam PowerShell disimpan dalam pengekodan UTF-8.

Bagaimana untuk menyimpan output PowerShell dalam pengekodan UTF-8, gunakan cmdlet Out-File

Pertimbangkan arahan berikut:

.\mysqldump.exe -u root --all-databases > all-databases.sql

Seperti yang telah ditunjukkan di atas, ia merosakkan aksara bukan Latin kerana pengekodan yang salah.

Dalam sesetengah sumber, sebagai penyelesaian kepada masalah, adalah disyorkan untuk menggantikan aksara “>” dengan “Fail Luar”, dan juga menentukan pengekodan menggunakan “ Pilihan -Pengekodan UTF8”. Iaitu, gunakan arahan berikut:

.\mysqldump.exe -u root --all-databases | Out-File -Encoding UTF8 all-databases_fixed.sql

Malah, kedua-dua dalam PowerShell 7 dan dalam PowerShell 5, arahan ini berubah sedikit. Pertama, arahan itu serupa dengan simbol ubah hala keluaran “>”. Kedua, secara lalai, cmdlet Fail Luar menggunakan pengekodan UTF-8, iaitu, ia tidak perlu untuk menyatakannya secara khusus.

Tetapi perkara yang paling penting ialah walaupun fakta bahawa data disimpan ke fail dengan pengekodan UTF-8 (dalam arahan sebelumnya, ini ialah fail all-databases_fixed.sql), bukan bahasa Latin aksara dalam fail ini masih rosak! Masalahnya ialah cmdlet Fail Luar pada mulanya memproses data yang diterima dalam pengekodan yang salah. Oleh itu, tidak lagi penting bagaimana sebenarnya Fail Luar menyimpan data – data sudah rosak pada masa penerimaan dalam cmdlet ini.

Masalah telah diselesaikan dengan menyatakan secara eksplisit pengekodan untuk data yang diterima:

[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("UTF-8")

Larian arahan seterusnya menyimpan semua data dalam pengekodan yang betul:

.\mysqldump.exe -u root --all-databases | Out-File -Encoding UTF8 all-databases_fixed.sql

Kaedah ini berfungsi sama baiknya dalam PowerShell 7 dan PowerShell 5.

Dengan cara ini, arahan asal menggunakan kaedah ini juga menyimpan data dalam pengekodan yang betul:

[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("UTF-8")
.\mysqldump.exe -u root --all-databases > all-databases.sql

Menyimpan output oleh utiliti pihak ketiga

Dalam semua arahan sebelumnya, kami mengubah hala keluaran mysqldump utiliti ke fail atau ke cmdlet Fail Luar. Tetapi utiliti mysqldump mempunyai pilihan --result-file yang selepas itu anda boleh menentukan nama fail untuk dikeluarkan. Iaitu, akibat menggunakan pilihan ini, anda tidak perlu menggunakan pengalihan keluaran atau cmdlet PowerShell.

Perintah berikut akan menyimpan pangkalan data dalam pengekodan yang betul:

.\mysqldump.exe -u root --all-databases --result-file=all-databases.sql