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 사용이유
일회성 리포트✓ 사용일부 글자 손실보다 파일 생성이 중요
정산 데이터✗ 금지한 글자 손실이 금액 오류로 이어짐
고객 이름✗ 금지잘못된 이름으로 연락 불가
첫 변환 테스트✗ 금지무엇이 깨지는지 봐야 함

안전한 접근법

  1. -c 없이 먼저 변환: 에러 메시지로 문제 파악
  2. 에러 원인 조사: 실제로 깨진 문자가 있는지, 아니면 파일이 EUC-KR이 아닌지
  3. 필요한 경우만 -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 변환은 기술적으로는 간단하지만, 검증 없이 진행하면 위험합니다.

  • 스크립트는 단순하게 (명확함이 최고)
  • 테스트는 철저하게 (샘플 먼저)
  • 원본은 항상 보존 (되돌리기 가능하도록)

이 원칙만 지키면, 매달 수백 개 파일도 안전하게 변환할 수 있습니다.

댓글