CSV diff가 전체 행을 다 다르다고 표시하는 인코딩 함정 3가지
"분명히 같은 데이터인데 CSV diff 도구가 모든 행을 '변경됨'으로 표시한다"는 문의는 실제로는 데이터가 바뀐 게 아니라 텍스트 인코딩 단계에서 어긋난 경우가 대부분입니다. 모두의 툴의 CSV Diff 비교기는 첫 번째 열을 키로 삼아 행을 매칭하는 키 기준 비교를 하지만, 파싱 이전 단계의 문자 인코딩·BOM·구분자 문제까지 자동으로 감지하거나 보정해주지는 않습니다. 이 가이드는 그 세 가지 함정을 원인 기준으로 분해합니다.
1. 함정 1: EUC-KR/CP949 vs UTF-8 인코딩 불일치
한국에서 만들어진 CSV는 엑셀에서 "CSV(쉼표로 분리)"로 저장할 때 기본 인코딩이 EUC-KR 또는 CP949인 경우가 많습니다. 이 파일을 UTF-8로 해석하는 편집기나 브라우저에 붙여넣으면 한글이 깨진 문자(모지바케)로 표시됩니다. 두 CSV 파일 중 하나는 UTF-8로, 다른 하나는 EUC-KR로 저장된 상태에서 비교하면, 값 자체는 같은 한글이라도 바이트 시퀀스가 완전히 다르므로 diff 로직 입장에서는 두 문자열이 애초에 다른 값입니다. 결과적으로 이름·주소 등 한글이 포함된 거의 모든 셀이 "변경됨"으로 표시됩니다.
2. 함정 2: UTF-8 BOM(Byte Order Mark) 유무
Windows 메모장이나 일부 엑셀 버전은 UTF-8로 저장할 때 파일 맨 앞에 보이지 않는 3바이트 BOM(U+FEFF)을 붙입니다. 이 BOM이 붙은 파일과 붙지 않은 파일을 비교하면, 첫 번째 셀 값(대개 헤더의 첫 컬럼명이나 첫 행 첫 셀) 앞에만 눈에 보이지 않는 문자가 하나 더 붙어 있는 상태가 됩니다. 육안으로는 id와 id가 똑같아 보이지만 실제 문자열은 "id"와 "id"로 서로 다르므로, 첫 번째 열이 헤더든 데이터든 항상 "다름"으로 처리되는 흔한 오류가 발생합니다.
3. 함정 3: 구분자(delimiter) 불일치
유럽·한국 로케일의 엑셀은 CSV를 저장할 때 세미콜론(;)을 기본 구분자로 쓰는 경우가 있고, 미국 로케일은 쉼표(,)를 씁니다. CSV Diff 비교기는 화면 상단에서 구분자를 쉼표·탭·세미콜론 중 사용자가 직접 선택하도록 되어 있는데, 두 파일이 서로 다른 구분자로 저장되어 있는데도 같은 구분자를 선택해 비교하면 한쪽 파일은 아예 컬럼이 쪼개지지 않아 한 줄 전체가 하나의 셀 값으로 인식됩니다. 이 상태에서 첫 번째 "열"을 키로 매칭하면 사실상 모든 행이 서로 다른 값으로 취급됩니다.
| 원인 | 증상 | 해결 |
|---|---|---|
| EUC-KR vs UTF-8 | 한글 셀이 모두 다르게 표시 | 비교 전 두 파일 모두 UTF-8로 재저장 |
| UTF-8 BOM 유무 | 첫 번째 열만 항상 다르게 표시 | BOM 없는 UTF-8로 통일해 저장 |
| 구분자 불일치(,/;/tab) | 거의 모든 행이 "변경됨" | 두 파일의 실제 구분자를 확인 후 도구에서 동일하게 선택 |
4. 비교 전 3분 점검 체크리스트
- 두 파일을 메모장/VS Code 등에서 열어 하단 상태바의 인코딩 표기(UTF-8, UTF-8 with BOM, ANSI/CP949 등)를 먼저 맞춥니다.
- 첫 줄 맨 앞 글자가 눈에 안 보이는 문자로 시작하지 않는지, 헤더 첫 컬럼명이 예상과 정확히 일치하는지 확인합니다.
- 파일을 열어 실제 구분자가 쉼표인지 세미콜론인지 탭인지 육안으로 확인한 뒤 도구의 구분자 옵션을 그에 맞춥니다.
이 세 가지를 맞춘 뒤에도 값이 다르게 나온다면 그때부터가 진짜 데이터 변경입니다. 인코딩을 맞추기 전에는 CSV Diff 비교기의 결과를 "데이터가 실제로 바뀌었다"는 증거로 신뢰하지 마세요.
자주 묻는 질문
Q. 도구가 인코딩이나 BOM을 자동으로 감지해서 경고해주나요?
아니요. 텍스트를 붙여넣는 방식이므로 브라우저가 이미 디코딩한 문자열을 받아 비교할 뿐, 원본 파일의 인코딩이나 BOM 유무를 자동으로 감지하거나 경고하지 않습니다. 비교 전에 사용자가 직접 인코딩을 통일해야 합니다.
Q. 첫 번째 열만 이상하게 항상 다르다고 나올 때 가장 먼저 의심해야 할 것은?
BOM(Byte Order Mark)입니다. 다른 열은 정상인데 첫 번째 열만 계속 "변경됨"으로 뜬다면, 두 파일 중 하나에만 UTF-8 BOM이 붙어 있을 가능성이 매우 높습니다.
Q. 구분자를 잘못 선택하면 어떤 증상이 나타나나요?
한 줄 전체가 쪼개지지 않고 하나의 값으로 인식되어, 첫 번째 열(키)로 사용되는 값이 사실상 그 행 전체 텍스트가 됩니다. 결과적으로 거의 모든 행이 매칭되지 못하고 추가/삭제로 표시됩니다.
Q. 셀 안에 쉼표가 포함된 값은 어떻게 처리되나요?
따옴표로 감싸진 필드(예: "값,포함")는 파서가 따옴표 안의 구분자를 무시하고 올바르게 파싱합니다. 다만 이는 구분자 자체가 올바르게 선택되어 있을 때만 유효합니다.