CMD 한글 깨짐 해결: 콘솔 코드 페이지 CHCP 설정 완전 정리

이 글의 목적은 Windows 명령 프롬프트(CMD)와 PowerShell에서 한글이 물음표(???), 깨진 글자, 상자(□)로 표시되는 문제를 코드 페이지와 CHCP 명령 설정을 통해 체계적으로 해결할 수 있도록 정리하는 것이다.

1. 콘솔에서 한글이 깨지는 근본 원리 이해

한글이 깨지는 근본 원인은 문자 인코딩이 서로 다르게 설정되어 있기 때문이다. 파일은 특정 인코딩(CP949, UTF-8 등)으로 저장되어 있고, 콘솔(CMD, PowerShell)은 또 다른 인코딩 코드 페이지를 사용한다. 이 둘이 맞지 않으면 콘솔이 바이트를 잘못 해석하여 깨진 글자가 나타난다.

Windows 콘솔에서는 인코딩을 “코드 페이지(Code Page)”라는 번호로 관리한다. 대표적인 예는 다음과 같다.

  • 437: 미국 영어 OEM 코드 페이지이다.
  • 949: 한국어(oem code page, CP949) 코드 페이지이다.
  • 65001: UTF-8 코드 페이지이다.

콘솔에서 현재 코드 페이지는 chcp 명령으로 확인하고 변경한다. 따라서 한글 깨짐 문제를 해결하려면 “현재 콘솔 코드 페이지”와 “출력 데이터의 인코딩”을 일치시켜야 한다.

1.1 코드 페이지와 OEM/ANSI 인코딩의 차이

Windows에는 크게 두 종류의 인코딩 계열이 있다.

  • OEM 코드 페이지: 콘솔용 인코딩이다. 예를 들어 한국어 Windows에서는 보통 949이다.
  • ANSI 코드 페이지: GUI 프로그램(메모장, 레거시 프로그램 등)에서 사용하는 인코딩이다. 한국어는 CP949(Windows-949)로 불리는 경우가 많다.

같은 “949”라는 숫자를 사용하지만, 실제로는 OEM/ANSI 설정이 다르게 동작할 수 있다. 그러나 실무에서는 “한글 콘솔 = 949, UTF-8 콘솔 = 65001” 정도의 관점에서 접근해도 대부분 문제를 해결할 수 있다.

1.2 CHCP 명령의 역할

CHCP(Change Code Page)는 현재 콘솔 세션에서 사용할 코드 페이지를 변경하는 명령이다. 형식은 다음과 같다.

chcp :: 현재 코드 페이지 확인 chcp 949 :: 콘솔을 CP949(한국어)로 변경 chcp 65001 :: 콘솔을 UTF-8로 변경 

코드 페이지를 바꾸면 같은 파일을 출력하더라도 화면에 보이는 글자가 달라진다. 따라서 “어떤 인코딩의 데이터인지”에 맞춰 chcp를 선택해야 한다.

2. 현재 콘솔 코드 페이지 확인 및 한글 출력 테스트

2.1 현재 코드 페이지 확인

CMD 또는 PowerShell을 열고 다음 명령을 실행한다.

chcp 

예를 들어 다음과 같은 출력이 나타난다.

현재 코드 페이지: 949 

또는 영어 버전에서는 다음과 같이 나타난다.

Active code page: 437 

2.2 한글 깨짐 재현 및 점검 방법

한글 깨짐 여부를 진단하려면, 간단한 한글 텍스트 파일 또는 에코 테스트를 사용한다.

  1. 메모장에서 파일 인코딩을 ANSI(CP949)로 지정하여 다음 내용을 저장한다.
    테스트입니다. 한글이 제대로 보이는지 확인합니다. 
  2. 파일명을 test_ansi.txt로 저장하고 CMD에서 다음과 같이 출력한다.
    type test_ansi.txt 
  3. 깨져 보이면 chcp 값을 확인하고, 아래에 설명하는 코드 페이지를 바꿔가며 다시 type 명령을 실행한다.

이 과정을 통해 “어떤 코드 페이지에서 어떤 파일 인코딩이 올바르게 보이는지”를 구체적으로 확인할 수 있다.

3. 한글 깨짐 유형별 원인과 해결 전략

실무에서 자주 만나는 한글 깨짐 상황을 정리하면 다음과 같다.

상황 주요 원인 대표 코드 페이지 상태 대표 해결책
CMD에서 파이썬 print 한글 깨짐 콘솔 CP949, 스크립트 파일 UTF-8 저장 949 chcp 65001 또는 파일 인코딩 CP949로 저장
배치 파일 echo 한글이 ???로 보임 배치 파일이 ANSI(CP949)가 아닌 UTF-8-BOM으로 저장 949 파일을 ANSI(CP949)로 저장하거나 chcp 65001 후 실행
git, npm 등 도구 출력 한글 깨짐 도구 출력은 UTF-8, 콘솔은 CP949 949 chcp 65001로 변경 후 실행
PowerShell에서 cat 파일 한글 깨짐 파일 인코딩과 PowerShell 출력 인코딩 불일치 949 또는 65001 $OutputEncoding 및 chcp를 함께 조정
주의 : “무조건 UTF-8이 정답”이라고 생각하고 chcp 65001로만 고정하면, 오히려 레거시 배치 파일이나 CP949 기반 도구에서 또 다른 깨짐이 발생할 수 있다. 사용 중인 도구와 스크립트의 인코딩 특성을 먼저 파악한 뒤 전략적으로 코드 페이지를 선택해야 한다.

4. CHCP로 코드 페이지 변경하여 한글 깨짐 해결하기

4.1 콘솔을 CP949(한국어) 코드 페이지로 맞추기

이미 존재하는 많은 레거시 배치 파일과 콘솔 유틸리티는 CP949를 기준으로 작성되었다. 이런 스크립트를 그대로 사용해야 한다면, 콘솔을 949로 맞추는 것이 안정적이다.

chcp 949 

이후 CP949 인코딩으로 저장된 텍스트 파일이나 배치 파일 출력이 정상적으로 표시되는지 확인한다.

4.2 콘솔을 UTF-8(65001) 코드 페이지로 맞추기

최근 개발 환경, 오픈소스 도구, 파이썬·Node.js 기반 스크립트는 대부분 UTF-8을 사용한다. 이 경우 콘솔도 UTF-8로 맞추는 것이 좋다.

chcp 65001 

이후 UTF-8로 저장된 파이썬 스크립트나 텍스트 파일을 출력하면 한글이 제대로 보이는지 확인한다.

4.3 세션마다 수동으로 CHCP 실행하기

가장 간단한 방법은 콘솔을 열 때마다 첫 줄에 필요한 chcp 명령을 실행하는 것이다.

REM CP949 기반 레거시 작업 chcp 949
REM UTF-8 기반 개발 작업
chcp 65001

이 방식은 가장 안전하지만, 매번 명령을 입력해야 한다는 번거로움이 있다. 이 단점을 해결하기 위해 자동화 방법을 사용할 수 있다.

5. CMD 콘솔에서 CHCP 자동 설정하기

5.1 CMD 바로가기(Shortcut)별 시작 코드 페이지 지정

특정 바로가기를 통해 실행되는 CMD에 대해, 자동으로 chcp를 적용하려면 다음과 같이 배치 파일을 중간에 두는 방법이 있다.

  1. utf8_cmd.bat 파일을 만든다.
  2. 내용을 다음과 같이 작성한다.
    @echo off chcp 65001 > nul cmd 
  3. 이 배치 파일의 바로가기를 만들어 자주 사용하는 위치에 둔다.

이렇게 하면 바로가기를 실행할 때마다 자동으로 코드 페이지가 65001로 변경된 후 새로운 CMD 세션이 열린다.

주의 : 배치 파일 내부에서 chcp를 사용해도, 그 이후에 실행되는 하위 CMD에만 적용되는 경우가 있다. 위 예시처럼 마지막 줄에 cmd를 다시 호출하여 “UTF-8용 콘솔 세션”을 새로 열면 혼란을 줄일 수 있다.

5.2 레지스트리 AutoRun으로 CHCP 강제 적용

모든 CMD 실행 시 특정 명령을 자동으로 수행하려면 AutoRun 키를 사용할 수 있다. 이 방법은 시스템 전체에 영향을 주므로 신중하게 적용해야 한다.

  1. regedit.exe를 실행한다.
  2. 다음 경로로 이동한다.
    HKEY_CURRENT_USER\Software\Microsoft\Command Processor 
  3. AutoRun 문자열 값을 새로 만들거나 수정하여 다음과 같이 설정한다.
    chcp 65001 & cls 

이제부터 사용자가 CMD를 열 때마다 자동으로 chcp 65001이 실행된다. 레거시 도구 호환성 문제로 다시 949로 되돌리고 싶다면, 값을 다음과 같이 바꾸면 된다.

chcp 949 & cls 
주의 : AutoRun에 여러 명령을 넣을 경우 & 또는 &&로 연결해야 한다. 잘못된 명령을 넣으면 CMD 실행 자체가 지연되거나 오류 메시지가 매번 나타난다. 문제가 생기면 안전 모드 또는 다른 계정으로 로그인하여 AutoRun 값을 삭제해야 한다.

6. PowerShell에서 한글 깨짐과 CHCP 연동

6.1 PowerShell은 콘솔 코드 페이지 + 출력 인코딩의 조합으로 동작한다

PowerShell에서는 chcp로 콘솔 코드 페이지를 바꿀 수 있지만, 동시에 PowerShell 내부의 출력 인코딩($OutputEncoding)도 고려해야 한다. 특히 외부 명령과 파이프라인을 사용할 때 인코딩이 꼬일 수 있다.

chcp 65001 $OutputEncoding = [Console]::OutputEncoding 

또는 명시적으로 UTF-8로 지정한다.

$OutputEncoding = [System.Text.UTF8Encoding]::new($false) 

이 설정은 외부 프로그램의 UTF-8 출력을 PowerShell이 깨지지 않게 처리하도록 도와준다.

6.2 PowerShell 프로필에 기본 설정 저장

PowerShell을 실행할 때마다 위 설정을 자동 적용하려면 프로필 스크립트에 추가한다.

  1. 현재 프로필 경로를 확인한다.
    $profile 
  2. 파일이 없으면 새로 만든다.
    New-Item -ItemType File -Path $profile -Force 
  3. 메모장으로 프로필 파일을 연다.
    notepad $profile 
  4. 다음 내용을 추가한다.
    chcp 65001 > $null $OutputEncoding = [System.Text.UTF8Encoding]::new($false) 

이제 PowerShell을 열 때마다 자동으로 코드 페이지와 출력 인코딩이 UTF-8로 맞춰진다.

7. 파이썬·배치 파일에서 한글 깨짐 방지 패턴

7.1 파이썬 스크립트에서 콘솔 한글 깨짐 방지

파이썬 스크립트에서 한글이 깨지는 원인은 크게 두 가지이다.

  • 스크립트 파일 인코딩과 콘솔 코드 페이지 불일치
  • 표준 출력 인코딩 설정 불일치

실무적으로 권장하는 기본 전략은 다음과 같다.

  1. 스크립트 파일을 UTF-8로 저장한다.
  2. 콘솔 코드 페이지를 65001로 설정한다.
    chcp 65001 python myscript.py 
  3. 필요하다면 파이썬 내부에서 인코딩을 명시한다.
    # -*- coding: utf-8 -*- print("한글 출력 테스트입니다.") 

7.2 배치 파일에서 한글 메시지 안전하게 사용하기

배치 파일은 CP949 기반 환경에서 가장 안정적으로 동작한다. 다음과 같은 패턴을 추천한다.

  1. 배치 파일을 작성할 때 메모장의 인코딩을 ANSI(CP949)로 저장한다.
  2. 배치 파일 첫 줄에서 코드 페이지를 명시적으로 949로 지정한다.
    @echo off chcp 949 > nul echo 한글 메시지 테스트입니다. pause 

만약 UTF-8 환경에서만 쓸 배치 파일이라면 다음처럼 작성할 수 있다.

@echo off chcp 65001 > nul echo 한글 메시지 테스트입니다. pause 
주의 : 배치 파일을 UTF-8-BOM으로 저장하면, 스크립트의 맨 앞에 BOM 바이트가 그대로 출력되거나 첫 줄 명령에 영향을 줄 수 있다. 배치 파일은 가능하면 ANSI(CP949) 또는 BOM 없는 UTF-8로 저장하는 것이 안정적이다.

8. 상황별 권장 CHCP 설정 가이드

실제 운영 환경에서 어떤 코드 페이지를 선택해야 할지 헷갈릴 수 있다. 다음 표는 대표적인 작업 환경에 대한 권장 설정을 정리한 것이다.

작업 유형 권장 코드 페이지 비고
레거시 배치 파일 실행, 오래된 내부 도구 949 파일 인코딩이 대부분 CP949 기반일 때 안정적이다.
Git, Node.js, Python, Docker 등 최신 개발 환경 65001 도구 출력이 UTF-8일 가능성이 높다.
혼합 환경(구형 도구 + 최신 도구 혼용) 949/65001 병행 바로가기 또는 배치 파일로 각각 별도 콘솔을 준비한다.
PowerShell 중심 개발·운영 65001 + $OutputEncoding 설정 프로필에 자동화 스크립트를 등록하는 것이 편리하다.

9. 문제 해결 체크리스트

마지막으로, 콘솔 한글 깨짐 문제가 발생했을 때 순서대로 점검할 수 있는 체크리스트를 정리한다.

  1. 현재 콘솔 코드 페이지 확인
    chcp 
  2. 파일 인코딩 확인
    • 메모장 또는 코드 에디터에서 인코딩 정보를 확인한다.
    • 가능하면 UTF-8 또는 ANSI(CP949)로 명확히 설정한다.
  3. 코드 페이지와 인코딩 맞추기
    • 파일이 CP949라면 chcp 949를 사용한다.
    • 파일이 UTF-8이라면 chcp 65001를 사용한다.
  4. PowerShell 사용 시 출력 인코딩 동시 점검
    $OutputEncoding 
  5. 지속적인 환경이면 자동화 적용
    • CMD AutoRun, PowerShell 프로필, 전용 배치 파일 등으로 코드 페이지 설정을 자동화한다.

FAQ

Q1. UTF-8을 쓰고 싶은데 chcp 65001을 쓰면 일부 프로그램이 오류를 낸다.

일부 레거시 콘솔 프로그램은 CP949를 전제로 구현되었기 때문에, 코드 페이지를 65001로 변경하면 출력이 깨지거나 프로그램이 비정상 동작할 수 있다. 이 경우 UTF-8용 콘솔과 CP949용 콘솔을 별도로 준비하는 전략이 유효하다. 예를 들어, 개발 작업용 바로가기는 chcp 65001을 적용한 배치 파일을 통해 열고, 레거시 업무용 콘솔은 기본값 949를 유지하는 식으로 분리 운영하면 충돌을 줄일 수 있다.

Q2. 메모장에서 UTF-8로 저장했는데도 CMD에서 한글이 깨진다.

메모장에서 “UTF-8”로 저장한 경우, 파일은 UTF-8 인코딩이지만 콘솔 코드 페이지가 여전히 949라면 깨지는 것이 정상이다. 이때는 파일 인코딩에 맞춰 콘솔을 chcp 65001로 바꿔야 한다. 반대로, 콘솔을 949로 유지하고 싶다면 파일을 ANSI(CP949)로 다시 저장해야 한다.

Q3. 파이썬에서 print는 정상인데, subprocess 결과 한글이 깨진다.

파이썬 내부 문자열은 UTF-8로 잘 처리되지만, subprocess로 외부 프로그램을 호출할 때 그 프로그램의 출력 인코딩과 콘솔 코드 페이지가 맞지 않으면 깨질 수 있다. 이때는 외부 프로그램의 출력 인코딩이 무엇인지 확인하고, subprocess.run(..., encoding="cp949") 또는 encoding="utf-8"과 같이 명시적으로 지정해 주거나, 콘솔 코드 페이지를 해당 인코딩에 맞게 조정하는 것이 좋다.

Q4. CHCP를 바꾸면 이미 실행 중인 프로그램의 출력도 즉시 바뀌나?

CHCP는 “콘솔 세션”이 어느 코드 페이지로 데이터를 해석할지 지정하는 설정이다. 이미 프로그램이 출력한 텍스트는 과거의 코드 페이지 기준으로 깨진 상태로 출력된 것이므로, CHCP를 나중에 바꾼다고 해서 이전 출력이 복구되지는 않는다. CHCP를 변경한 후에는 프로그램을 다시 실행하여 정상 출력 여부를 확인해야 한다.

Q5. 시스템 전체 기본 코드 페이지를 영구적으로 UTF-8로 바꿔도 되는가?

Windows 언어 설정에서 “베타: 유니코드 UTF-8을 사용하여 전 세계 언어 지원” 옵션을 활성화하면 시스템 전반의 비유니코드 프로그램 동작이 변한다. 최신 프로그램에는 유리할 수 있지만, 레거시 소프트웨어 호환성 문제가 새로 생길 수 있다. 일반 업무 환경에서는 이 옵션을 기본값으로 유지하고, 필요할 때 콘솔 수준에서만 chcp 65001을 사용하는 것이 안전하다.