본문 바로가기

CSV 한글 깨짐: UTF-8·BOM·CP949를 파일 세 개로 구분하기

파일·브라우저 실험작성 SW픽 편집부 · 발행
프로그램
Microsoft Excel
환경
macOS 26.6.2 · 가상 CSV·ID 문자열
버전
Python 3.12.14 · UTF-8·CP949
실험·자료 확인일

UTF-8 BOM: EF BB BF / 정상 디코딩: 세 파일의 문장 동일 / CP949를 UTF-8로 읽기: UnicodeDecodeError

CSV 한글 깨짐: UTF-8·BOM·CP949를 파일 세 개로 구분하기의 핵심 문제와 공개 예제 결과를 정리한 표지

CSV를 열었더니 한글이 깨지는 경우에는 파일이 손상됐다고 결론 내리기 전에 어떤 문자 인코딩으로 읽었는지 확인해야 합니다. 같은 한글 문장도 UTF-8과 CP949에서 서로 다른 바이트가 됩니다. 깨진 글자를 다시 저장하면 처음에는 멀쩡했던 원문까지 바뀔 수 있으므로, 읽기 옵션을 바꾸는 작업과 파일 내용을 고치는 작업을 분리하십시오.

먼저 구분할 조건

텍스트 파일의 인코딩은 글자를 바이트로 표현하는 규칙입니다. 확장자 .csv가 그 규칙까지 지정하지는 않습니다. UTF-8 BOM은 파일 처음의 EF BB BF라는 바이트로 UTF-8 사용을 식별하는 데 도움을 줄 수 있지만, 모든 CSV 프로그램이 BOM을 같은 방식으로 처리하지는 않습니다. 어떤 도구에서는 첫 열 이름 앞에 보이지 않는 문자가 남을 수 있습니다. 한글이 잘 보이는지만 확인하지 말고 첫 열 이름과 데이터 행도 읽어야 합니다.

CSV 한글 깨짐: UTF-8·BOM·CP949를 파일 세 개로 구분하기의 공개 예제 관찰 결과와 확인 항목
공개 예제의 확인 항목을 정리한 설명용 도식입니다. 실제 제품 앱 화면은 아닙니다.

직접 확인한 예제와 방법

name·amount 헤더와 한글예제라는 가상 이름을 UTF-8, UTF-8 BOM, CP949 세 파일에 저장했습니다. Python 3.12.14에서 각각 utf-8, utf-8-sig, cp949로 다시 읽었을 때 문장이 동일했습니다. BOM 파일의 처음 세 바이트는 EF BB BF였고, CP949 파일을 UTF-8로 엄격하게 읽으면 UnicodeDecodeError가 발생했습니다. 실제 고객 명단은 사용하지 않았습니다. 이번 결과는 같은 문자와 다른 저장 바이트를 구분하는 시험입니다.

이 글의 공개 자료에서 확인한 결과
확인 항목 관찰 결과
UTF-8 BOM EF BB BF
정상 디코딩 세 파일의 문장 동일
CP949를 UTF-8로 읽기 UnicodeDecodeError

결과를 해석하는 기준

잘못된 인코딩으로 읽었을 때 오류가 나는 것은 유용한 신호입니다. 오류를 무시하거나 깨진 문자를 대체해서 보여 주는 설정에서는 파일이 열린 것처럼 보이지만 일부 문자가 이미 다른 값으로 바뀔 수 있습니다. 변환이 필요한 자료라면 원문을 정확한 규칙으로 먼저 읽은 다음 목표 인코딩으로 별도 파일을 저장해야 합니다.

BOM이 없다고 UTF-8이 아니라고 판단해서는 안 됩니다. UTF-8은 BOM 없이도 사용할 수 있습니다. 반대로 파일 처음에 BOM처럼 보이는 바이트가 있다는 단서만으로 전체 문서가 정상이라고 승인할 수 없습니다. 자료를 만든 프로그램의 내보내기 설정, 헤더, 한글·숫자·특수문자를 함께 확인하는 것이 더 확실합니다.

제공 인코딩과 수신 인코딩이 다른 경우

작성 예제로, 옛 업무 시스템은 CP949를 요구하고 새 분석 도구는 UTF-8을 받는 상황을 생각해 볼 수 있습니다. 먼저 CP949 원문을 정확히 읽고 UTF-8 사본을 따로 만들어야 합니다. 깨진 문장을 현재 화면에서 저장하는 작업을 인코딩 변환이라고 부르면 원래 문자가 바뀐 시점을 놓칩니다.

상황 확인할 질문 먼저 할 일
원본 CP949가 정상 원문을 어떤 규칙으로 읽었나 정확히 디코딩 후 사본 변환
한글은 맞고 첫 헤더만 이상 BOM 문자가 남았나 첫 열 이름까지 대조
깨진 저장본만 있음 변환 전 원본이 있는가 이전 파일·제공자 재출력 확인

전달 규칙에는 UTF-8이라는 이름뿐 아니라 BOM 허용 여부와 구분자도 적으십시오. 인코딩을 맞춘 뒤 행·열·ID가 바뀌지 않았는지 확인해야 실제 자료가 유지됩니다.

내 자료에서 확인할 순서

  1. 원본 파일을 복사하고 현재 잘못 열린 상태에서 덮어 저장하지 않습니다. 파일 제공자가 어떤 인코딩으로 내보냈는지 알려 줬는지도 확인합니다.
  2. 스프레드시트의 텍스트 가져오기 미리보기에서 파일 원본·인코딩 선택이 있는지 확인합니다. UTF-8과 해당 자료의 알려진 인코딩을 작은 사본에서 비교합니다.
  3. 한글이 맞아도 헤더가 정상인지 확인합니다. 첫 열 이름에 예상하지 않은 문자가 붙으면 BOM 처리와 열 이름 비교를 점검합니다.
  4. 변환 후에는 다른 파일명으로 저장합니다. 원본에서 정상적으로 읽은 문장과 변환본에서 다시 읽은 문장을 대조합니다.
  5. 숫자 열과 ID 열도 확인합니다. 인코딩이 맞아도 구분자·따옴표·자료형 조건이 틀리면 열이나 앞자리 0이 바뀔 수 있습니다.
  6. 전달할 때는 파일 이름뿐 아니라 인코딩·구분자·줄바꿈 규칙을 함께 적습니다. 가능한 경우 작은 예제와 정상 헤더를 같이 제공합니다.

잘못 바꾸었거나 확인이 어려울 때

어떤 인코딩으로도 문장이 정상적으로 돌아오지 않으면 이미 다른 규칙으로 읽고 저장한 파일일 수 있습니다. 현재 깨진 문장을 여러 번 변환해 모양만 맞추려 하면 원래 바이트와의 관계를 더 잃습니다. 변환 전 원본이나 제공자의 재내보내기 자료를 확보하는 편이 낫습니다. 기관·회사 시스템에 필요한 특정 인코딩이 있다면 임의로 UTF-8로 통일하기 전에 수신 요구를 확인해야 합니다.

정상 완료 기준

한글·헤더·숫자·구분자가 기대한 값으로 읽히고, 변환본을 다시 열어도 같은 문장이 남아야 합니다. 공개 파일 세 개처럼 저장 방식이 달라도 정확히 디코딩한 내용이 같다는 확인이 있어야 변환 완료로 볼 수 있습니다. 읽기 과정에서 대체 문자나 인코딩 오류를 조용히 넘긴 경우에는 이 기준을 충족했다고 판단하지 않습니다.

같은 예제를 다시 확인할 자료

CP949와 UTF-8만으로 모든 한글 파일을 분류할 수는 없습니다. 실제 파일은 다른 인코딩을 쓰거나 여러 형식의 내용을 섞고 있을 수 있습니다. 이 예제는 바이트를 직접 확인하는 방법을 보여 주며 임의의 파일 인코딩을 항상 자동 추정하는 검사는 아닙니다.

자료는 비민감 가상 예제입니다. 손상·불일치라고 표시한 파일은 차이를 확인하는 실험용이며 업무 원본으로 사용하지 않습니다. 파일 크기·SHA-256 목록으로 내려받은 원본을 확인할 수 있습니다.

문자가 정상인데 열이나 행이 틀리면 인코딩과 CSV 구조를 따로 봐야 합니다. 기존 CSV의 ID별 관계 비교에서도 원문 형식을 보존하는 이유를 확인할 수 있습니다.

OFFICIAL SOURCES

확인한 공식 자료

CORRECTION

화면이 달라졌나요?

운영체제와 프로그램 버전, 달라진 단계를 알려주시면 다시 확인합니다.

정정 요청 보내기