근본 원인: 명령마다 다른 인코딩
한국어 Windows의 PowerShell 5.1에서 Get-Content 는 BOM 없는 파일을 ANSI, 즉 CP949로 읽습니다. Set-Content 도 CP949로 쓰고, Out-File 과 > 는 UTF-16으로, Export-Csv 는 ASCII로 씁니다. PowerShell 7은 이를 통일해 어디서나 BOM 없는 UTF-8을 씁니다.
- UTF-8 파일을 5.1로 읽으면: CP949로 해석되어 한글이
�와 엉뚱한 한자로 바뀝니다. 이 경우 화면 출력만 깨진 것이라 원본 파일은 멀쩡합니다.-Encoding UTF8로 다시 읽으세요. - 5.1에서 Export-Csv로 저장하면: ASCII에 한글이 없어 모두
?로 저장됩니다. 이 글자는 되돌릴 수 없으니 다시 내보내야 합니다. - 5.1에서 Out-File로 저장하면: UTF-16 파일이 되어 일부 프로그램이 읽지 못합니다.
파일을 올바르게 읽고 쓰기
Get-Content data.csv -Encoding UTF8은 BOM 없는 UTF-8 파일도 제대로 읽습니다.- CP949 파일은 5.1에서
-Encoding Default, 7에서-Encoding 949로 읽습니다. Set-Content,Out-File,Add-Content는-Encoding UTF8로 UTF-8을 씁니다. 5.1에서는 항상 BOM이 붙습니다.Export-Csv data.csv -Encoding UTF8 -NoTypeInformation으로 ASCII 기본값을 피합니다.- 모든 명령에 한 번에 적용하려면 스크립트 맨 위에
$PSDefaultParameterValues['*:Encoding'] = 'utf8'을 넣습니다.
Invoke-RestMethod와 Invoke-WebRequest
서버가 Content-Type 에 문자셋을 밝히지 않으면 PowerShell 5.1은 응답을 ISO-8859-1로 읽습니다. 그러면 UTF-8 응답의 한글이 안녕 처럼 보입니다. 응답을 바이트로 받아 직접 디코딩하세요. 예: [Text.Encoding]::UTF8.GetString((Invoke-WebRequest $url).RawContentStream.ToArray()).
깨진 글자
성명,부서,사무실 김민준,구매팀,서울 본사 박지훈,재무팀,부산 지사
복구 후
성명,부서,사무실 김민준,구매팀,서울 본사 박지훈,재무팀,부산 지사
한글이 들어간 스크립트 파일
.ps1 파일을 BOM 없는 UTF-8로 저장하면 PowerShell 5.1은 CP949로 읽어 Write-Host "안녕하세요" 같은 문자열이 깨지거나 구문 오류가 납니다. 스크립트는 BOM 있는 UTF-8로 저장하세요. VS Code에서는 상태 표시줄의 인코딩에서, Notepad++에서는 인코딩 메뉴의 UTF-8-BOM으로 바꿀 수 있습니다.
콘솔 창만 깨질 때
콘솔 출력만 깨지고 파일은 멀쩡한 경우도 많습니다. 한국어 Windows 콘솔의 기본 코드 페이지는 949입니다. [Console]::OutputEncoding = [Text.Encoding]::UTF8 로 출력을 UTF-8로 바꾸고, 외부 프로그램에 파이프로 넘기는 출력에는 $OutputEncoding = [Text.Encoding]::UTF8 도 설정하세요.
이미 깨진 채 저장된 파일은 위 상자에 끌어다 놓으세요. 안녕 형태나 CP949 파일은 UTF-8로 복구됩니다. 이미 ? 로 바뀐 글자는 되돌릴 수 없습니다(글자 깨짐이란).
자주 묻는 질문
내 PowerShell 버전은 어떻게 확인하나요?
$PSVersionTable.PSVersion 을 입력하세요. 5.1 은 Windows에 기본으로 들어 있는 Windows PowerShell이고, 7 부터는 기본으로 UTF-8을 씁니다.
PowerShell로 만든 CSV가 엑셀에서 깨지는 이유는?
PowerShell 7은 BOM 없는 UTF-8로 저장하는데, 한국어판 엑셀은 이런 CSV를 CP949로 엽니다. -Encoding utf8BOM 으로 저장하거나 Mojibuster에서 BOM을 넣어 저장하세요. 자세한 내용은 엑셀 CSV 한글 깨짐에 있습니다.
chcp 65001이 필요한가요?
콘솔 코드 페이지를 따르는 외부 프로그램을 쓸 때만 필요합니다. PowerShell 안에서는 [Console]::OutputEncoding 설정으로 충분합니다. Windows 설정의 “Beta: 세계 언어 지원을 위해 Unicode UTF-8 사용”은 다른 오래된 프로그램의 한글을 깨뜨릴 수 있어 주의가 필요합니다.