Արդյունքների կոդավորման խնդիրները 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 կոդավորման մեջ, օգտագործեք Out-File cmdlet-ը

Դիտարկենք հետևյալ հրամանը.

.\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-ում այս հրամանը քիչ է փոխվում: Նախ, հրամանը նման է ելքային վերահղման «>» խորհրդանիշին: Երկրորդ, լռելյայնորեն, Out-File cmdlet-ն օգտագործում է UTF-8 կոդավորումը, այսինքն՝ անհրաժեշտ չէ այն հատուկ նշել:

Բայց ամենակարևորն այն է, որ չնայած այն հանգամանքին, որ տվյալները պահվում են UTF-8 կոդավորմամբ ֆայլում (նախորդ հրամանում սա all-databases_fixed.sql ֆայլն է), ոչ լատիներեն: Այս ֆայլի նիշերը դեռ վնասված են: Բանն այն է, որ Out-Filecmdlet-ը սկզբում սխալ կոդավորումով մշակում է ստացված տվյալները։ Հետևաբար, այլևս կարևոր չէ, թե ինչպես է 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 օգտակար ծրագրի ելքը դեպի ֆայլ կամ Out-File cmdlet: Բայց mysqldump կոմունալն ունի --result-file տարբերակ, որից հետո կարող եք նշել ֆայլի անունը, որը պետք է թողարկվի: Այսինքն՝ այս տարբերակն օգտագործելու արդյունքում կարիք չկա օգտագործել ելքային վերահղում կամ PowerShell cmdlet-ներ։

Հետևյալ հրամանը կպահի տվյալների բազան ճիշտ կոդավորման մեջ.

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