배치 파일 한글 경로 깨짐 해결 방법: chcp 65001 UTF-8 코드페이지 적용 완전 정리

이 글의 목적은 배치 파일 실행 시 한글 경로와 한글 출력이 깨지는 문제를 원인별로 분해하고, chcp 65001 적용부터 파일 인코딩, 호출 체인, 예약 작업 환경까지 재현 가능한 절차로 해결하도록 돕는 것이다.

1. 증상과 문제 정의

배치 파일에서 한글 폴더 경로를 참조하거나 한글 파일명을 처리할 때 경로가 물음표로 바뀌거나 파일을 찾지 못하는 현상이 발생하다.

echo로 출력한 한글이 깨져 보이거나 로그 파일에 한글이 깨져 저장되는 현상이 동반되다.

같은 배치 파일이 탐색기에서 더블클릭으로 실행할 때와 다른 프로그램에서 호출할 때 결과가 달라지는 경우도 흔하다.

2. 한글 경로가 깨지는 핵심 원인

2.1 콘솔 코드페이지 불일치가 원인이다

배치 파일은 cmd.exe 콘솔 환경의 코드페이지 영향을 직접 받다.

Windows 한국어 환경은 보통 CP949 기반으로 동작하다.

콘솔 코드페이지가 배치 파일 내용 인코딩과 맞지 않으면 한글이 깨지다.

2.2 배치 파일 자체 인코딩이 원인이다

배치 파일이 UTF-8로 저장되어도 BOM 유무에 따라 cmd.exe 해석이 달라지다.

ANSI(CP949)로 저장된 파일을 UTF-8 코드페이지에서 읽으면 한글이 깨지다.

UTF-8로 저장된 파일을 CP949 코드페이지에서 읽으면 한글이 깨지다.

2.3 호출 체인과 호스트 프로그램이 원인이다

스케줄러, 서비스, 원격 실행 도구, 빌드 도구, IDE 터미널은 기본 코드페이지와 글꼴 렌더링이 달라지다.

PowerShell에서 cmd를 거쳐 배치를 호출할 때 인자 인코딩이 변형되다.

다른 배치가 call로 호출할 때 중간에서 chcp가 바뀌면 후속 처리가 깨지다.

3. 가장 빠른 해결책: chcp 65001 적용 기준

3.1 chcp 65001의 의미와 기대효과이다

chcp 65001은 cmd 콘솔 코드페이지를 UTF-8로 바꾸는 명령이다.

배치 내용이 UTF-8로 저장되어 있고, 출력과 경로 처리도 UTF-8로 통일할 때 효과가 크다.

주의 : chcp 65001만 적용해도 모든 환경이 자동으로 해결되는 것이 아니다. 배치 파일 저장 인코딩, 호출 방식, 외부 도구가 생성하는 문자열 인코딩까지 같이 맞춰야 안정적으로 동작하다.

3.2 배치 파일 상단에 넣는 표준 템플릿이다

@echo off setlocal EnableExtensions EnableDelayedExpansion
REM 콘솔을 UTF-8로 전환하다
chcp 65001 >nul

REM 출력 품질을 위해 제목과 글꼴 설정을 고려하다
title UTF-8 Batch

REM 예시 경로이다
set "BASE=C:\Users\Public\문서\테스트"
echo BASE=%BASE%

REM 파일 존재 확인 예시이다
if exist "%BASE%\샘플.txt" (
echo 파일을 찾다
) else (
echo 파일을 찾지 못하다
)

endlocal

3.3 chcp 적용 위치와 범위가 중요하다

chcp는 현재 cmd 세션에만 적용되다.

배치를 다른 배치에서 call로 호출하면 같은 세션을 공유하므로 적용이 이어지다.

배치를 start로 새 창에서 실행하면 새 세션이 생성되므로 다시 적용이 필요하다.

4. 배치 파일 인코딩을 올바르게 저장하는 방법

4.1 권장 조합을 먼저 정리하다

목표 콘솔 코드페이지 배치 파일 저장 인코딩 권장도 설명
한글 경로와 출력 모두 안정 65001 UTF-8(BOM 권장) 매우 높다 배치 상단 chcp 65001 적용을 전제로 하다
기존 레거시 호환 949 ANSI(CP949) 중간 외부 도구와 로그가 CP949를 가정하면 유리하다
혼합 환경 혼재 혼재 낮다 깨짐 재발 가능성이 높다

4.2 UTF-8 저장 시 BOM을 권장하는 이유이다

cmd.exe는 UTF-8 BOM이 있는 파일을 UTF-8로 해석하는 경향이 강하다.

UTF-8 BOM이 없으면 환경에 따라 ANSI로 오인하는 경우가 생기다.

편집기는 “UTF-8 with BOM” 또는 “UTF-8(BOM)”으로 저장하는 설정이 필요하다.

4.3 편집기별 저장 가이드이다

Windows 메모장은 최신 버전에서 UTF-8 저장 옵션을 제공하다.

Notepad++는 인코딩 메뉴에서 UTF-8 BOM 포함 저장을 선택하다.

VS Code는 상태바 인코딩에서 UTF-8로 저장하되 BOM 설정을 정책으로 관리하는 것이 안전하다.

5. 한글 경로 처리에서 자주 터지는 포인트와 처방이다

5.1 set 변수에 따옴표를 잘못 섞는 실수이다

경로 변수는 set "VAR=값" 패턴을 쓰는 것이 안전하다.

값 안에 공백과 한글이 섞여도 안정적으로 처리하다.

set "DIR=C:\작업 폴더\데이터" copy "%DIR%\입력.txt" "%DIR%\백업\입력.txt" 

5.2 delayed expansion과 느낌표가 섞이는 문제이다

EnableDelayedExpansion을 켜면 ! 문자가 확장 구문으로 처리되다.

파일명에 ! 가 포함된 경우 경로가 변형되다.

이 경우 구간별로 delayed expansion을 끄고 켜는 방식이 필요하다.

@echo off setlocal EnableExtensions
chcp 65001 >nul

set "P=C:\테스트\A!B\파일.txt"

setlocal DisableDelayedExpansion
echo %P%
endlocal

endlocal

5.3 for /f가 출력 인코딩을 바꾸는 문제이다

for /f는 명령 출력과 파싱 과정에서 인코딩 문제를 더 크게 만들다.

가능하면 PowerShell로 UTF-8 출력 고정 후 값을 전달받는 전략이 유리하다.

주의 : for /f 내부에서 실행되는 명령이 한글을 출력하면 파싱 단계에서 깨짐이 누적되다. 한글 출력이 필요한 명령은 로그 파일로 직접 기록하거나 PowerShell로 우회하는 구성이 안전하다.

6. PowerShell에서 배치 호출 시 한글 인자가 깨지는 경우 해결이다

6.1 문제 구조를 먼저 이해하다

PowerShell은 기본적으로 유니코드 문자열을 다루다.

PowerShell이 cmd.exe로 인자를 넘길 때 코드페이지와 이스케이프 규칙이 바뀌다.

배치에서 받은 %1 값이 깨지면 경로 자체가 잘못 전달된 상태이다.

6.2 권장 호출 예시이다

REM PowerShell에서 실행할 때 예시이다 powershell -NoProfile -ExecutionPolicy Bypass -Command ^ "& cmd /d /c chcp 65001 ^> nul ^& call ""C:\스크립트\run.bat"" ""C:\한글 경로\입력.txt""" 

이 방식은 cmd 세션에서 코드페이지를 먼저 맞춘 뒤 배치를 실행하는 구조이다.

7. 로그 파일에 한글이 깨지는 문제 해결이다

7.1 리다이렉션은 콘솔 인코딩 영향을 받다

echo 결과를 > 로그.txt로 저장하면 콘솔 코드페이지에 따라 바이트가 기록되다.

UTF-8 로그가 필요하면 chcp 65001과 UTF-8 저장이 같이 필요하다.

7.2 PowerShell을 로그 엔진으로 쓰는 실전 방식이다

@echo off setlocal EnableExtensions
chcp 65001 >nul

set "LOG=%~dp0run.log"
set "MSG=한글 로그를 UTF-8로 남기다"

powershell -NoProfile -Command ^
"$m='%MSG%'; $m | Out-File -FilePath '%LOG%' -Encoding utf8 -Append"

endlocal

Out-File -Encoding utf8을 사용하면 로그 파일 인코딩이 예측 가능하다.

8. 예약 작업과 서비스 계정에서 특히 주의할 점이다

8.1 스케줄러는 사용자 세션과 다른 콘솔 환경이다

작업 스케줄러는 상호작용 세션이 아닌 백그라운드 세션으로 실행되다.

이때 기본 코드페이지와 콘솔 글꼴 환경이 달라지다.

배치 상단에서 명시적으로 chcp를 설정하는 것이 필수에 가깝다.

8.2 작업 시작 위치가 비어 있으면 상대경로가 깨지다

상대경로 문제를 한글 깨짐으로 오해하는 경우가 많다.

스케줄러 작업 속성에서 “시작 위치”를 배치 폴더로 지정하는 습관이 필요하다.

9. 실무용 점검 체크리스트이다

점검 항목 확인 방법 정상 기준 조치
콘솔 코드페이지 chcp 실행 결과 확인하다 65001 또는 의도한 값이다 배치 상단에 chcp 65001 >nul 적용하다
배치 파일 인코딩 편집기 인코딩 표시 확인하다 UTF-8(BOM) 또는 CP949로 일관하다 권장 조합으로 재저장하다
경로 변수 선언 set 구문 확인하다 set "VAR=값" 형태이다 따옴표 위치 수정하다
호출 체인 PowerShell, 스케줄러, 다른 배치 확인하다 코드페이지 전환이 앞단에서 보장되다 cmd /d /c chcp 65001 후 call 구조로 정리하다
로그 인코딩 로그 파일을 편집기로 열어 확인하다 UTF-8로 정상 표시이다 PowerShell Out-File -Encoding utf8 적용하다

10. 자주 쓰는 실전 레시피 모음이다

10.1 현재 배치 파일 위치 기준으로 경로 고정하다

@echo off setlocal EnableExtensions
chcp 65001 >nul

set "ROOT=%~dp0"
set "DATA=%ROOT%데이터"
echo ROOT=%ROOT%
echo DATA=%DATA%

endlocal

10.2 다른 배치를 호출할 때 환경을 유지하다

@echo off setlocal EnableExtensions
chcp 65001 >nul

call "%~dp0sub\작업.bat" "C:\한글 경로\입력.txt"

endlocal

10.3 새 창으로 실행해도 깨지지 않게 하다

@echo off setlocal EnableExtensions
start "" cmd /d /k "chcp 65001 >nul & cd /d ""%~dp0"" & call ""%~f0"" _child"
exit /b

:_child
chcp 65001 >nul
echo 새 세션에서도 UTF-8을 유지하다
endlocal

FAQ

chcp 65001을 쓰면 오히려 일부 명령이 이상해지는 이유는 무엇이다?

일부 레거시 도구가 CP949 바이트를 가정하고 출력하거나 입력을 처리하기 때문이다.

이 경우 배치 전체를 UTF-8로 통일하기보다, 레거시 도구 호출 구간만 CP949로 유지하는 분리 전략이 필요하다.

UTF-8로 저장했는데도 한글이 깨지면 무엇을 먼저 의심해야 하다?

배치 파일에 BOM이 없는 UTF-8인지 확인하는 것이 우선이다.

그 다음 호출 체인에서 다른 cmd 세션이 열리며 코드페이지가 초기화되는지 확인하는 것이 필요하다.

한글 경로 파일 복사가 실패하는데 echo 출력은 정상인 경우 원인은 무엇이다?

상대경로 기준 폴더가 달라져 파일을 못 찾는 경우가 흔하다.

또한 따옴표 위치 오류로 실제 경로 문자열이 바뀌는 경우도 흔하다.

작업 스케줄러에서만 깨지면 어떤 처방이 우선이다?

배치 상단에서 chcp 65001을 강제하고, 작업 시작 위치를 명시하는 것이 우선이다.

로그는 PowerShell Out-File utf8로 남기는 구성이 재현성과 검증에 유리하다.