Решение проблем с кодировкой вывода в PowerShell и сторонних утилитах, запущенных в PowerShell


Какая кодировка используется в PowerShell по умолчанию. Как в PowerShell поменять кодировку вывода по умолчанию на UTF-8

Если вы выполните следующую команду в 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

Создаст файл all-databases_ps5.sql в кодировке UTF-16LE в который с помощью mysqldump будут экспортированы все базы данных MySQL (с целью создания резервной копии). В этих базах данных будут безвозвратно испорчены ВСЕ не латинские символы!

То есть вместо кириллицы будет примерно следующее:

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

Следующая команда, выполненная в PowerShell 7:


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

Создаст файл all-databases_ps7.sql в кодировке UTF-8 в который с помощью mysqldump будут экспортированы все базы данных MySQL (с целью создания резервной копии). Но в этих базах данных ВНОВЬ будут безвозвратно испорчены ВСЕ нелатинские символы!

То есть казалось бы, кодировка по умолчанию изменилась на UTF-8, но проблема с полностью испорченными резервными копиями баз данных никуда не делась.

Как в PowerShell сохранить выходные из сторонних программ данные в кодировке UTF-8

Показанное выше поведение, при котором портится вывод команд в PowerShell, является недопустимым. Рассмотрим, как гарантировать, что вывод в PowerShell будет сохранён в кодировке UTF-8.

Для сохранения вывода в PowerShell в кодировке UTF-8 используйте комнадлет Out-File

Смотрите также: Как в PowerShell сохранить вывод в файл (аналоги > и >>)

Рассмотрим следующую команду:

.\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 использует кодировку UTF-8, то есть указывать её специально необязательно.

Но самое главное в том, что несмотря на то, что данные сохраняются в файл с кодировкой UTF-8 (в предыдущей команде это файл all-databases_fixed.sql), нелатинские символы в этом файле всё равно испорчены! Всё дело в том, что командлет Out-File полученные данные изначально обрабатывает в неверной кодировке. Поэтому уже не имеет значение, как именно Out-File сохраняет данные — данные испорчены уже в момент поступления в данный командлет.

Проблему удалось решить с помощью явного указания кодировки для получаемых данных:

[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. Но утилита mysqldump имеет опцию --result-file после которой можно указать имя файла для вывода. То есть в результате использования данной опции не нужно задействовать перенаправление вывода или командлеты PowerShell.

Следующая команда сохранит базу данных в правильной кодировке:

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


Рекомендуется Вам:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *