PowerShell 한글 깨짐 해결하기

PowerShell로 읽거나 저장한 파일의 한글이 깨지거나 ? 로 바뀌나요? Windows PowerShell 5.1은 명령마다 기본 인코딩이 달라서 -Encoding 을 직접 지정해야 합니다. 원인과 올바른 설정을 정리했고, 이미 깨진 파일은 위 상자에서 복구할 수 있습니다.

텍스트와 다음 파일을 지원합니다:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

엑셀 내보내기, 데이터베이스 덤프, 자막, 웹사이트 코드 등.

복구하기

  1. 파일을 끌어다 놓거나 텍스트 붙여넣기
  2. 자동으로 복구
  3. 복사하거나 내려받기
또는 파일을 여기로 끌어다 놓기
  • 업로드 없음. 파일은 브라우저 안에서 복구되며 기기 밖으로 나가지 않습니다.

  • EU 내 서버. Mojibuster는 핀란드(EU)의 서버에서 운영되며 EU 일반 개인정보 보호법(GDPR)이 적용됩니다. GDPR 원문(EUR-Lex, 영어)

근본 원인: 명령마다 다른 인코딩

한국어 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()).

PowerShell 5.1에서 문자셋 없이 받은 API 응답을 CSV로 저장한 경우

깨진 글자

성명,부서,사무실
김민준,구매팀,서울 본사
박지훈,재무팀,부산 지사

복구 후

성명,부서,사무실
김민준,구매팀,서울 본사
박지훈,재무팀,부산 지사

한글이 들어간 스크립트 파일

.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 사용”은 다른 오래된 프로그램의 한글을 깨뜨릴 수 있어 주의가 필요합니다.

관련 안내