윈도우에서 클로드 코드(Claude Code)를 쓰다 보면 한글이 세 군데에서 각각 다르게 깨집니다.
// ① 터미널 출력
?????? ??? ???
// ② 파이썬 실행
UnicodeEncodeError: 'cp949' codec can't encode character '✓'
// ③ 만들어 준 PowerShell 스크립트 실행
+ Write-Output "?��?��"
~~~~~~
문자열에 종료 기호가 없습니다.
세 증상 모두 AI 도구의 버그가 아닙니다. 윈도우의 기본 문자 인코딩이 UTF-8이 아니라 CP949(euc-kr 계열)이기 때문에 생기는 오래된 문제이고, 도구가 한글을 많이 다루게 되면서 한꺼번에 드러난 것입니다.
깨지는 지점이 셋이므로, 고치는 곳도 셋입니다. 하나만 고치고 "왜 아직도 깨지지"를 반복하는 경우가 대부분입니다.
| 증상 | 깨지는 지점 | 고칠 곳 |
|---|---|---|
화면에 ?나 네모 | 터미널 출력 인코딩 | 콘솔 코드페이지 |
UnicodeEncodeError: 'cp949' | 프로그램의 표준 출력 | 환경 변수 · 스크립트 상단 |
| 스크립트가 실행조차 안 됨 | 파일 저장 인코딩 | UTF-8 BOM으로 저장 |
① 터미널 출력이 ?로 나올 때
콘솔의 코드페이지를 UTF-8(65001)로 바꿉니다. 임시로는 이 한 줄이면 됩니다.
chcp 65001
PowerShell이라면 출력·입력 인코딩까지 함께 지정하는 편이 확실합니다.
# PowerShell 프로필에 넣어두면 매번 적용된다
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
[Console]::InputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
프로필 파일 위치는 이렇게 확인하고, 없으면 만들면 됩니다.
echo $PROFILE
# 없으면
New-Item -ItemType File -Path $PROFILE -Force
근본 해결 — 시스템 로캘을 UTF-8로
매번 설정하기 싫다면 윈도우 전체를 UTF-8로 돌릴 수 있습니다.
설정 → 시간 및 언어 → 언어 및 지역 → 시스템 로캘 변경 → "세계 언어 지원을 위한 Beta: 유니코드 UTF-8 사용" 체크 → 재부팅
② UnicodeEncodeError: 'cp949' — 파이썬
파이썬이 print()로 한글이나 특수문자(✓, →, 이모지)를 출력할 때 터집니다. 스크립트 안의 한글은 멀쩡한데 출력하는 순간 죽는 것이 특징입니다.
방법 A — 환경 변수 (가장 간단)
# 현재 세션만
$env:PYTHONIOENCODING = "utf-8"
# 영구 적용
[Environment]::SetEnvironmentVariable(
"PYTHONIOENCODING", "utf-8", "User")
방법 B — 스크립트 자체가 스스로 해결하게 (권장)
다른 PC나 자동화(작업 스케줄러)에서도 돌아가야 한다면, 환경 변수에 기대지 말고 스크립트 상단에서 표준 출력을 UTF-8로 다시 감싸는 편이 안전합니다.
# -*- coding: utf-8 -*-
import sys, io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
파일 읽기·쓰기도 마찬가지
# ❌ 윈도우에서는 기본이 cp949 라 깨진다
open("data.txt").read()
# ✅ 항상 명시
open("data.txt", encoding="utf-8").read()
open("out.txt", "w", encoding="utf-8").write(text)
③ 스크립트가 실행조차 안 될 때 — BOM 문제
여기가 가장 안 알려져 있고, 가장 오래 헤매는 지점입니다. AI가 만들어 준 .ps1 파일을 실행했더니 문법 오류가 나고, 열어보면 코드는 멀쩡합니다.
Write-Output "발행 완료"
# → 문자열에 종료 기호가 없습니다.
Windows PowerShell 5.1은 BOM이 없는 파일을 CP949로 읽습니다. UTF-8로 저장된 한글이 CP949로 해석되면서 따옴표 짝이 깨진 것처럼 보이는 것입니다. 코드가 아니라 파일이 저장된 방식이 문제입니다.
.ps1 파일은 UTF-8 BOM 포함으로 저장할 것. "UTF-8"과 "UTF-8 with BOM"은 다른 선택지이고, PowerShell 5.1에서는 후자여야 합니다.
# BOM 포함으로 다시 저장
$content = Get-Content .\script.ps1 -Raw -Encoding UTF8
[System.IO.File]::WriteAllText(
"$PWD\script.ps1", $content,
[System.Text.UTF8Encoding]::new($true)) # $true = BOM 포함
에디터에서라면 VS Code 오른쪽 아래 인코딩 표시를 눌러 Save with Encoding → UTF-8 with BOM을 고르면 됩니다.
Set-Content로 파일을 만들 때
# ❌ PowerShell 5.1의 Set-Content 기본값은 시스템 ANSI(CP949)
Set-Content out.txt $text
# ✅ 명시
Set-Content out.txt $text -Encoding utf8
AI 도구에 아예 규칙으로 박아두기
매번 "한글 안 깨지게 저장해 줘"라고 말하는 대신, 프로젝트 규칙 파일(CLAUDE.md 등)에 적어두면 계속 적용됩니다. 실제로 효과가 큰 부분입니다.
# 인코딩 규칙 (윈도우 환경)
- 모든 텍스트 파일은 UTF-8 로 저장한다.
- .ps1 파일은 반드시 UTF-8 **BOM 포함** 으로 저장한다.
(BOM 이 없으면 PowerShell 5.1 이 CP949 로 읽어 파싱이 깨진다)
- 파이썬 스크립트는 상단에 표준 출력 UTF-8 래핑을 넣는다.
- open() 과 Set-Content 에는 인코딩을 항상 명시한다.
터미널에서 한글 입력이 이상할 때
출력이 아니라 입력 쪽 증상도 있습니다. 한글을 치는 도중 글자가 커서와 어긋나게 그려지거나, 문장 중간을 수정하면 조합이 흐트러지는 현상입니다.
이것은 코드페이지가 아니라 터미널의 IME 처리 문제라 설정으로 해결되지 않습니다. 대응은 두 가지입니다.
- 도구를 최신 버전으로 업데이트 — 한국어·중국어·일본어 조합 입력 처리는 개선이 이어지는 영역입니다.
- 긴 한글 프롬프트는 다른 곳에서 작성해 붙여넣기 — 조합 중 렌더링 문제라, 완성된 문자열을 붙여넣으면 영향을 받지 않습니다.
점검 순서
| 확인 | 내용 |
|---|---|
| 1 | chcp를 쳐서 949인지 65001인지 본다 |
| 2 | 깨지는 것이 화면 출력인지 저장된 파일인지 가른다 (파일을 다른 에디터로 열어 확인) |
| 3 | 파이썬이면 PYTHONIOENCODING 또는 스크립트 상단 래핑 |
| 4 | .ps1이 실행 안 되면 BOM 여부부터 (내용이 아니라 저장 방식) |
| 5 | 자동화로 돌릴 때만 깨진다면 실행 계정의 환경 변수를 의심 |
| 6 | git에서 한글 파일명이 \355\225\234처럼 보이면 git config --global core.quotepath false |
자주 묻는 질문
Q. chcp 65001을 했는데도 깨집니다.
깨지는 지점이 출력이 아니라 파일 저장일 가능성이 큽니다. 그 파일을 VS Code로 열어 오른쪽 아래 인코딩 표시를 확인하세요. CP949로 저장돼 있다면 코드페이지를 아무리 바꿔도 그대로입니다.
Q. 손으로 실행하면 되는데 작업 스케줄러에서만 깨집니다.
실행 계정이 달라 환경 변수가 적용되지 않은 것입니다. 환경 변수 대신 스크립트 자체가 인코딩을 지정하도록 바꾸면 실행 주체와 무관해집니다.
Q. UTF-8 BOM을 넣으면 다른 데서 문제 되지 않나요?
.ps1은 BOM이 있어야 안전하고, 반대로 셸 스크립트(.sh)·JSON·YAML은 BOM이 있으면 안 됩니다. 파일 종류에 따라 다르므로 일괄로 BOM을 붙이지 마세요.
Q. PowerShell 7을 쓰면 해결되나요?
많이 나아집니다. 기본 인코딩이 UTF-8이라 BOM 문제에서 자유롭습니다. 다만 윈도우에 기본 설치된 5.1도 함께 남아 있으므로, 스크립트가 어느 쪽으로 실행되는지는 여전히 확인해야 합니다.
Q. AI가 만든 코드의 한글 주석만 깨집니다.
파일 저장 인코딩 문제입니다. 소스 파일을 UTF-8로 저장하고, 자바 계열이라면 컴파일 옵션에 -encoding UTF-8이 들어가 있는지도 확인하세요.
정리
윈도우에서 한글이 깨질 때 가장 먼저 할 일은 고치는 게 아니라 어디서 깨졌는지 가르는 것입니다. 화면에서 깨진 것인지, 파일에 잘못 저장된 것인지, 파일은 멀쩡한데 읽는 쪽이 잘못 해석한 것인지에 따라 답이 완전히 다릅니다.
그리고 한 번 고쳤으면 규칙으로 남기세요. 인코딩 문제는 잊을 만하면 다른 얼굴로 돌아오고, 그때마다 같은 시간을 다시 씁니다.
