웹사이트 검색

PowerShell 및 PowerShell에서 실행되는 타사 유틸리티의 출력 인코딩 문제(SOLVED)


기본적으로 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

mysqldump(백업용)를 사용하여 모든 MySQL 데이터베이스를 내보낼 UTF-16LE 인코딩 all-databases_ps5.sql 파일을 만듭니다. 이 데이터베이스에서 라틴 문자가 아닌 모든 문자는 복구 불가능하게 손상됩니다!

즉, 키릴 문자 대신 다음과 같이 됩니다.

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

PowerShell 7에서 실행되는 다음 명령:

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

mysqldump(백업용)를 사용하여 모든 MySQL 데이터베이스를 내보낼 UTF-8 인코딩 all-databases_ps7.sql 파일을 만듭니다. 그러나 이러한 데이터베이스에서 라틴 문자가 아닌 모든 문자는 복구 불가능하게 다시 손상됩니다!

즉, 기본 인코딩이 UTF-8로 변경된 것처럼 보이지만 완전히 손상된 데이터베이스 백업 문제는 사라지지 않았습니다.

PowerShell에서 UTF-8 인코딩으로 타사 프로그램의 출력을 저장하는 방법

PowerShell에서 명령 출력을 손상시키는 위의 동작은 허용되지 않습니다. PowerShell의 출력이 UTF-8 인코딩으로 저장되는지 확인하는 방법을 살펴보겠습니다.

UTF-8 인코딩으로 PowerShell 출력을 저장하는 방법, Out-File cmdlet 사용

다음 명령을 고려하십시오.

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

위에 이미 표시된 것처럼 잘못된 인코딩으로 인해 라틴어가 아닌 문자가 손상됩니다.

일부 소스에서는 문제 해결 방법으로 > 문자를 Out-File로 교체하고 -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-File cmdlet이 처음에 수신된 데이터를 잘못된 인코딩으로 처리한다는 것입니다. 따라서 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