Article
EUC-KR CSV 파일을 UTF-8로 안전하게 변환하기
EUC-KR 파일이 아직도 존재하는 이유
Windows, 구형 시스템, 정부 기관의 레거시 데이터베이스에서는 여전히 EUC-KR 인코딩을 사용합니다. 개발자 입장에서는 UTF-8로 통일하려 해도, 정산, 주문, 거래처 데이터는 EUC-KR로 들어옵니다.
한두 파일이면 Excel에서 열어 저장하면 되지만, 100개 파일을 매달 변환해야 한다면?
스크립트 한 줄로 끝내는 것이 정답입니다.
iconv: 인코딩 변환의 표준 도구
iconv는 Unix/Linux 표준 도구로, 텍스트 인코딩을 변환합니다. 특징:
- 표준 출력 사용: 원본을 안전하게 보존할 수 있음
- 강력한 문자 지원: CP949, EUC-KR, UTF-8, ISO-8859-1 등 지원
- 배치 처리 용이: 셸 스크립트로 대량 파일 처리
검증된 변환 스크립트
#!/usr/bin/env bash
set -euo pipefail
# UTF-8 폴더 생성
mkdir -p utf8
# 현재 디렉터리의 모든 CSV 파일 변환
for csv_file in ./*.csv; do
[ -e "$csv_file" ] || continue
echo "변환 중: $csv_file"
iconv -c -f euc-kr -t utf-8 "$csv_file" > "utf8/$(basename "$csv_file")"
done
echo "변환 완료. utf8/ 폴더 확인하세요."
이 방식의 장점
| 항목 | 효과 |
|---|---|
| 원본 보존 | 문제 발생 시 재시도 가능 |
| 재현 가능 | 같은 스크립트로 매달 자동화 |
| 오류 감지 | 변환 과정에서 실패하면 즉시 알 수 있음 |
| 간단함 | 이전 버전도 간단하게 유지 |
-c 옵션: 강력하지만 주의가 필요한 옵션
-c 플래그는 “변환할 수 없는 문자는 버린다”는 의미입니다.
상황별 사용 판단:
| 시나리오 | -c 사용 | 이유 |
|---|---|---|
| 일회성 리포트 | ✓ 사용 | 일부 글자 손실보다 파일 생성이 중요 |
| 정산 데이터 | ✗ 금지 | 한 글자 손실이 금액 오류로 이어짐 |
| 고객 이름 | ✗ 금지 | 잘못된 이름으로 연락 불가 |
| 첫 변환 테스트 | ✗ 금지 | 무엇이 깨지는지 봐야 함 |
안전한 접근법
- -c 없이 먼저 변환: 에러 메시지로 문제 파악
- 에러 원인 조사: 실제로 깨진 문자가 있는지, 아니면 파일이 EUC-KR이 아닌지
- 필요한 경우만 -c 추가: “운영상 일단 파일이 필요하다”는 상황에서만
변환 전: 꼭 확인해야 할 3가지
1단계: 샘플 파일로 테스트
# 하나만 변환해보기 (원본은 안 건드림)
iconv -f euc-kr -t utf-8 sample.csv > sample_utf8.csv
# Excel이나 텍스트 에디터로 열어보기
# → 한글이 깨졌는가?
# → 구분자(쉼표, 탭)가 정상인가?
2단계: 파일이 정말 EUC-KR인가?
# 파일 인코딩 확인
file -i sample.csv
# 결과: text/plain; charset=iso-8859-1 (또는 euc-kr)
Windows에서 “EUC-KR”이라고 표시된 파일도 실제로는 CP949일 수 있습니다.
3단계: 원본 백업
# 변환 전 원본 보관
cp -r . ../euc-kr-backup/
변환 후: 필수 체크리스트
변환이 끝났다고 끝나는 게 아닙니다. 반드시 확인하세요:
- 파일 개수: 원본과 변환본이 같은 수인가?
- 샘플 검수: 2~3개 파일을 Excel에서 열어 한글이 정상인가?
- 구분자: 쉼표, 탭이 제대로 있는가?
- 줄바꿈: 행 개수가 맞는가? (파일 크기 비교)
- -c 옵션 사용 여부: 썼다면 손실된 문자가 허용 범위인가?
흔한 실수와 해결책
실수 1: 원본을 직접 덮어쓰기
# ❌ 절대 하지 마세요
iconv -f euc-kr -t utf-8 data.csv > data.csv
변환 도중 인코딩이 잘못 판단되면 데이터가 날아갑니다.
실수 2: Windows의 CP949를 EUC-KR로 처리하기
Windows의 “한글” 인코딩은 실제로는 CP949입니다.
# 실패할 수 있음
iconv -f euc-kr -t utf-8 windows_file.csv
# 해결: CP949 시도
iconv -f cp949 -t utf-8 windows_file.csv -c
실수 3: 줄바꿈 형식 무시
Windows(CRLF)와 Unix(LF) 줄바꿈이 섞여 있으면 변환 후 라인 카운트가 맞지 않을 수 있습니다.
# 줄바꿈 형식 확인
file sample.csv
# CRLF인지 LF인지 확인
프로덕션 배치 스크립트
검증을 거친 최종 버전:
#!/usr/bin/env bash
set -euo pipefail
BACKUP_DIR="../backup-$(date +%Y%m%d-%H%M%S)"
mkdir -p utf8 "$BACKUP_DIR"
echo "원본 백업 중..."
cp *.csv "$BACKUP_DIR/" || echo "CSV 파일이 없습니다"
echo "변환 중..."
for csv_file in ./*.csv; do
[ -e "$csv_file" ] || continue
basename "$csv_file"
iconv -f euc-kr -t utf-8 "$csv_file" > "utf8/$(basename "$csv_file")" 2>/dev/null || \
echo "⚠ 변환 실패: $csv_file"
done
echo ""
echo "✓ 변환 완료"
echo "결과: utf8/ 디렉터리 확인"
echo "백업: $BACKUP_DIR/"
echo ""
echo "다음 단계:"
echo "1. utf8/ 폴더의 샘플 2-3개 파일 확인"
echo "2. 한글, 구분자, 라인 수 정상 확인"
echo "3. 원본은 유지하고 필요시 백업 삭제"
마치며
EUC-KR 변환은 기술적으로는 간단하지만, 검증 없이 진행하면 위험합니다.
- 스크립트는 단순하게 (명확함이 최고)
- 테스트는 철저하게 (샘플 먼저)
- 원본은 항상 보존 (되돌리기 가능하도록)
이 원칙만 지키면, 매달 수백 개 파일도 안전하게 변환할 수 있습니다.
댓글