Решение проблем с кодировкой вывода в 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
Связанные статьи:
- Ошибки «Оператор "<" зарезервирован для использования в будущем» и «The '<' operator is reserved for future use.» (РЕШЕНО) (100%)
- Как в PowerShell сохранить вывод в файл (аналоги > и >>) (94.1%)
- Аналог echo в PowerShell (54.9%)
- Как в PowerShell менять набор выводимых по умолчанию данных (54.9%)
- Как выводить данные без таблицы в PowerShell (54.9%)
- Тонкая настройка вывода с Format-Table (RANDOM - 54.9%)