Çështjet e kodimit të daljes në PowerShell dhe shërbimet e palëve të treta që ekzekutohen në PowerShell (ZGJIDHUR)


Çfarë kodimi përdoret në PowerShell si parazgjedhje. Si të ndryshoni kodimin e paracaktuar të daljes në UTF-8 në PowerShell

Nëse ekzekutoni komandën e mëposhtme në PowerShell 5:


"Testing" > test.file

Dhe kontrolloni kodimin në test.file të sapokrijuar, rezulton se është UTF-16LE.

Nëse ekzekutoni komandën e mëposhtme në PowerShell 7:


"Testing" > test.file

Dhe kontrolloni kodimin në test.file të sapokrijuar, rezulton se është UTF-8.

Komanda e mëposhtme, e ekzekutuar në PowerShell 5:


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

Krijon një skedar të koduar UTF-16LE all-databases_ps5.sql në të cilin të gjitha bazat e të dhënave MySQL do të eksportohen duke përdorur mysqldump (për qëllime rezervë). Në këto baza të dhënash, TË GJITHA karakteret jo latine do të korruptohen në mënyrë të pakthyeshme!

Kjo do të thotë, në vend të cirilikës, do të jetë diçka e tillë:

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

Komanda e mëposhtme, e ekzekutuar në PowerShell 7:


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

Krijon një skedar UTF-8 të koduar all-databases_ps7.sql në të cilin të gjitha bazat e të dhënave MySQL do të eksportohen duke përdorur mysqldump (për qëllime rezervë). Por në këto baza të dhënash, TË GJITHA karakteret jo latine do të korruptohen përsëri në mënyrë të pakthyeshme!

Kjo do të thotë, duket se kodimi i paracaktuar ka ndryshuar në UTF-8, por problemi me kopjet rezervë të bazës së të dhënave plotësisht të korruptuara nuk është zhdukur.

Si të ruani daljen nga programet e palëve të treta në kodimin UTF-8 në PowerShell

Sjellja e mësipërme, e cila korrupton daljen e komandave në PowerShell, nuk është e pranueshme. Le të shohim se si të sigurohemi që dalja në PowerShell të ruhet në kodimin UTF-8.

Si të ruani daljen e PowerShell në kodimin UTF-8, përdorni cmdlet Out-File

Merrni parasysh komandën e mëposhtme:


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

Siç u tregua tashmë më lart, ai korrupton karakteret jo latine për shkak të kodimit të gabuar.

Në disa burime, si zgjidhje për problemin, rekomandohet të zëvendësohet karakteri > me Out-File, dhe gjithashtu të specifikoni kodimin duke përdorur Opsioni -Encoding UTF8”. Kjo do të thotë, përdorni komandën e mëposhtme:


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

Në fakt, si në PowerShell 7 ashtu edhe në PowerShell 5, kjo komandë ndryshon pak. Së pari, komanda është analoge me simbolin e ridrejtimit të daljes >. Së dyti, si parazgjedhje, cmdlet Out-File përdor kodimin UTF-8, domethënë nuk është e nevojshme ta specifikoni atë në mënyrë specifike.

Por gjëja më e rëndësishme është se pavarësisht nga fakti që të dhënat ruhen në një skedar me kodim UTF-8 (në komandën e mëparshme, ky është skedari all-databases_fixed.sql), jo latinisht karakteret në këtë skedar janë ende të korruptuar! Puna është se cmdlet Out-File fillimisht përpunon të dhënat e marra në kodim të gabuar. Prandaj, nuk ka më rëndësi se si saktësisht Out-File i ruan të dhënat – të dhënat janë të korruptuara tashmë në momentin e marrjes në këtë cmdlet.

Problemi u zgjidh duke specifikuar në mënyrë eksplicite kodimin për të dhënat e marra:


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

Ekzekutimi i mëpasshëm i komandës i ruajti të gjitha të dhënat në kodimin e duhur:


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

Kjo metodë funksionon po aq mirë në PowerShell 7 dhe PowerShell 5.

Nga rruga, komanda origjinale duke përdorur këtë metodë gjithashtu ruan të dhënat në kodimin e duhur:


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

Ruajtja e prodhimit nga shërbimet e palëve të treta

Në të gjitha komandat e mëparshme, ne ridrejtuam daljen e mjetit mysqldump në një skedar, ose në cmdlet Out-File. Por mjeti mysqldump ka një opsion --result-file pas të cilit mund të specifikoni një emër skedari për të dalë. Kjo do të thotë, si rezultat i përdorimit të këtij opsioni, nuk keni nevojë të përdorni ridrejtimin e daljes ose cmdlet PowerShell.

Komanda e mëposhtme do të ruajë bazën e të dhënave në kodimin e duhur:


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