Проблеми со кодирање на излезот во PowerShell и комуналните услуги од трети страни што работат во PowerShell (РЕШЕНИ)
Какво кодирање се користи стандардно во PowerShell. Како да го смените стандардното излезно кодирање во UTF-8 во PowerShell
Ако ја извршите следнава команда во PowerShell 5:
"Testing" > test.file
И проверете го кодирањето во новосоздадената test.file, ќе излезе дека е UTF-16LE.
Ако ја извршите следнава команда во PowerShell 7:
"Testing" > test.file
И проверете го кодирањето во новосоздадената test.file, ќе излезе дека е UTF-8.
Следната команда, извршена во PowerShell 5:
.\mysqldump.exe -u root --all-databases > all-databases_ps5.sql
Создава UTF-16LE кодирана датотека all-databases_ps5.sql во која ќе се извезат сите бази на податоци на MySQL користејќи mysqldump (за цели на резервна копија). Во овие бази на податоци, СИТЕ знаци кои не се латински ќе бидат неповратно оштетени!
Односно, наместо кирилица, ќе биде вака:
'╨Р╤А╨▒╨╕╤В╤А╨░╨╢╨╜╤Л╨╣ ╨┐╤А╨╛╤Ж╨╨╨Г╤Б╤╤Б: ╡╤Б: ╨╕ ╨║/╨Ъ.╨Ь. ╨Р╤А╤Б╨╗╨░╨╜╨╛╨▓, ╨Ф.╨е. ╨Т╨░╨╗╨╡╨╡╨▓, ╨а.╨Э. ╨У╨╕╨╝╨░╨╖╨
Следната команда, извршена во PowerShell 7:
.\mysqldump.exe -u root --all-databases > all-databases_ps7.sql
Создава UTF-8 кодирана датотека all-databases_ps7.sql во која ќе се извезат сите MySQL бази на податоци со помош на mysqldump (за цели на резервна копија). Но, во овие бази на податоци, СИТЕ знаци кои не се латински ќе бидат повторно неповратно оштетени!
Тоа е, се чини дека стандардното кодирање е променето во UTF-8, но проблемот со целосно оштетените резервни копии на базата на податоци не исчезна.
Како да зачувате излез од програми од трети страни во UTF-8 кодирање во PowerShell
Горенаведеното однесување, кое го корумпира излезот на командите во PowerShell, не е прифатливо. Ајде да погледнеме како да се осигураме дека излезот во PowerShell е зачуван во UTF-8 кодирање.
Како да го зачувате излезот PowerShell во кодирањето UTF-8, користете го cmdlet-от Out-File
Размислете за следнава команда:
.\mysqldump.exe -u root --all-databases > all-databases.sql
Како што веќе беше прикажано погоре, ги корумпира нелатинските знаци поради неправилно кодирање.
Во некои извори, како решение за проблемот, се препорачува да се замени знакот „>“ со „Out-File“, а исто така да се наведе кодирањето со помош на „ -Encoding UTF8” опција. Тоа е, користете ја следнава команда:
.\mysqldump.exe -u root --all-databases | Out-File -Encoding UTF8 all-databases_fixed.sql
Всушност, и во PowerShell 7 и во PowerShell 5, оваа команда малку се менува. Прво, командата е аналогна на симболот за пренасочување на излезот „>“. Второ, стандардно, cmdlet Out-File користи кодирање UTF-8, односно не е неопходно конкретно да се специфицира.
Но, најважно е што и покрај фактот што податоците се зачувани во датотека со кодирање UTF-8 (во претходната команда, ова е датотеката all-databases_fixed.sql), не латиница знаците во оваа датотека сè уште се оштетени! Работата е во тоа што cmdlet Out-File првично ги обработува добиените податоци во погрешно кодирање. Затоа, повеќе не е важно како точно Out-File ги зачувува податоците - податоците се оштетени веќе во моментот на прием во овој cmdlet.
Проблемот беше решен со експлицитно специфицирање на кодирањето за примените податоци:
[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("UTF-8")
Последователното извршување на командата ги зачува сите податоци во правилното кодирање:
.\mysqldump.exe -u root --all-databases | Out-File -Encoding UTF8 all-databases_fixed.sql
Овој метод работи подеднакво добро во PowerShell 7 и PowerShell 5.
Патем, оригиналната команда користејќи го овој метод, исто така, ги зачувува податоците во правилното кодирање:
[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("UTF-8")
.\mysqldump.exe -u root --all-databases > all-databases.sql
Заштеда на излез од комунални услуги од трети страни
Во сите претходни команди, го пренасочивме излезот од алатката mysqldump во датотека или во cmdlet Out-File. Но, алатката mysqldump има опција --result-file по која можете да наведете име на датотека за излез. Тоа е, како резултат на користење на оваа опција, не треба да користите пренасочување на излезот или cmdlets PowerShell.
Следната команда ќе ја зачува базата на податоци во правилното кодирање:
.\mysqldump.exe -u root --all-databases --result-file=all-databases.sql