- 공유 링크 만들기
- X
- 이메일
- 기타 앱
이 글의 목적은 엑셀에서 CSV·TXT 등 텍스트 데이터를 가져올 때 발생하는 인코딩 깨짐을 원인별로 분석하고, 윈도우·macOS, 32/64비트, 레거시 마법사·Power Query별 실무 해결 절차와 자동화 스크립트까지 제공하여 현장에서 즉시 적용 가능하도록 돕는 것이다.
1. 인코딩이란 무엇이며 왜 깨지는가
인코딩은 문자를 바이트로 변환하는 규칙을 의미하며, 디코딩은 바이트를 문자로 되돌리는 규칙을 의미한다. 텍스트 파일을 저장할 때 사용한 인코딩과 엑셀이 불러올 때 가정하는 인코딩이 일치하지 않으면 글자가 깨진다. 특히 한국어 환경에서는 EUC-KR(또는 CP949)과 UTF-8 간 불일치가 빈번하다. UTF-8 BOM 유무 또한 자동 감지 결과에 영향을 준다.
| 형식 | 특징 | 장점 | 주의사항 |
|---|---|---|---|
| UTF-8 with BOM | 파일 맨 앞 3바이트(0xEF BB BF)로 UTF-8 표시가 있다 | 엑셀이 UTF-8을 비교적 안정적으로 감지한다 | 일부 시스템에서 BOM이 예상치 못한 토큰으로 해석될 수 있다 |
| UTF-8 (BOM 없음) | 표시 바이트가 없다 | 대부분의 서비스·리눅스 도구와 호환이 좋다 | 엑셀 자동열기에서 ANSI로 오인하여 한글이 깨질 수 있다 |
| EUC-KR/CP949 | MS 한글 코드페이지 | 국내 레거시 시스템과 호환성이 높다 | 이모지·확장 한자 등은 표현 불가하다 |
| UTF-16LE | 2바이트 단위 인코딩 | 레거시 윈도우 메모장에서 기본으로 사용되었다 | CSV 등 다른 도구에서 비호환 가능성이 있다 |
2. 가장 안전한 원칙
- 가능하면 UTF-8로 통일하여 저장한다.
- 엑셀에서 자동열기를 피하고, 가져오기 경로에서 인코딩을 명시한다.
- 구분자는 쉼표(,)·탭(\t)·세미콜론(;) 등 실제 파일과 일치시키고, 텍스트 한정자(예: ")를 확인한다.
- 열 데이터 형식(일반·텍스트·날짜)을 가져오기 단계에서 지정한다.
3. 방법 A: Power Query(데이터 > 데이터 가져오기)로 인코딩 지정
Power Query는 엑셀 2016 이후 기본 제공되며, 대용량·반복 자동화에 적합하다.
- 데이터 > 데이터 가져오기 > 텍스트/CSV에서 파일을 선택한다.
- 미리보기 창 오른쪽 파일 원본 드롭다운에서 65001: Unicode(UTF-8) 또는 949: 한국어(Windows) 를 선택한다.
- 구분 기호(Comma, Tab 등)와 데이터 형식을 확인하고 데이터 변환 을 눌러 편집기에서 열별 형식을 지정한다.
- 닫기 및 로드 를 눌러 시트나 데이터 모델로 로드한다.
| 상황 | 권장 파일 원본(인코딩) | 구분 기호 | 비고 |
|---|---|---|---|
| UTF-8 CSV(웹·API 산출) | 65001: Unicode(UTF-8) | Comma | BOM 유무와 무관하게 지정한다 |
| 국내 레거시 시스템 CSV | 949: 한국어(Windows) | Comma | 숫자 앞 0 보존 시 열 형식을 텍스트로 지정한다 |
| 탭 구분 TXT | 해당 인코딩 선택 | Tab | 열 머리글 자동감지 여부 확인 |
3.1 Power Query 고급 스크립트(M)로 인코딩 강제
파일 원본 드롭다운이 기대대로 동작하지 않는 환경에서는 M 스크립트로 인코딩 코드를 강제할 수 있다.
let 소스 = Csv.Document( File.Contents("C:\data\sample.csv"), [ Delimiter=",", Columns=8, Encoding=65001, // UTF-8 QuoteStyle=QuoteStyle.Csv ] ), 표 = Table.PromoteHeaders(소스, [PromoteAllScalars=true]) in 표
주요 코드값은 65001(UTF-8), 949(한국어 Windows), 1200(UTF-16LE)이다.
4. 방법 B: 레거시 텍스트 가져오기 마법사로 인코딩 지정
엑셀에서 마법사가 보이지 않으면 파일 > 옵션 > 데이터 에서 레거시 가져오기 마법사 표시 를 켠다.
- 데이터 > 레거시 마법사 > 텍스트 파일에서 를 선택한다.
- 원본 파일 에서 65001 : Unicode(UTF-8) 또는 949 : 한국어(Windows) 를 선택한다.
- 구분된 또는 고정 너비 를 선택하고, 구분 기호와 텍스트 한정자를 맞춘다.
- 열 데이터 형식을 열별로 텍스트 · 날짜(YYYY-MM-DD) · 일반 으로 지정한다.
5. 방법 C: 메모장/에디터로 사전 변환 후 열기
현장에서 파일 공급처가 다양할 때, 엑셀 이전 단계에서 UTF-8로 통일하는 것도 유효하다.
- 메모장으로 열기 > 다른 이름으로 저장 > 인코딩: UTF-8 로 저장한다.
- VS Code에서는 우하단 인코딩 표시 클릭 > Save with Encoding > UTF-8 을 선택한다.
6. 방법 D: VBA로 인코딩 지정 가져오기 자동화
반복 작업을 자동화하려면 VBA의
Workbooks.OpenText
를 사용한다.
Sub ImportCsvUtf8() Dim f As String f = "C:\data\sample.csv" Workbooks.OpenText _ Filename:=f, _ Origin:=65001, _ 'UTF-8 DataType:=xlDelimited, _ TextQualifier:=xlTextQualifierDoubleQuote, _ ConsecutiveDelimiter:=False, _ Comma:=True, Tab:=False, Semicolon:=False, _ Local:=False '시스템 로캘 무시 End Sub
CP949 파일은
Origin:=949
로 변경한다.
7. 대용량·배치 처리 시 팁
- Power Query로 가져와서 쿼리만 로드 후 피벗이나 모델에서 처리한다.
-
파일명이 날마다 바뀌면
Folder.Files와 필터를 활용하여 최신 파일만 참조한다. - 구분자 안에 쉼표가 포함된 텍스트 필드는 반드시 쌍따옴표로 감싼다.
8. 윈도우 vs macOS 환경 차이
| 항목 | Windows | macOS | 대응 |
|---|---|---|---|
| 자동열기 인코딩 추정 | ANSI로 오인 가능성이 높다 | UTF-8 인식이 상대적으로 안정적이다 | 양쪽 모두 가져오기 경로로 명시 지정한다 |
| 레거시 마법사 | 옵션에서 활성화 가능하다 | 제한적이다 | Power Query를 우선 사용한다 |
| 파일명 한글 | 대체로 문제없다 | 구버전에서 경로 인식 이슈가 있다 | 영문 경로 사용을 권장한다 |
9. CSV 저장 시 올바른 인코딩 선택
엑셀에서 파일 > 다른 이름으로 저장 시 아래 형식을 구분한다.
| 형식 | 설명 | 인코딩 | 권장 사용처 |
|---|---|---|---|
| CSV UTF-8(쉼표로 분리) | 엑셀 기본 UTF-8 저장 | UTF-8(BOM 포함) | 대부분의 웹서비스·DB 업로드 |
| CSV(쉼표로 분리) | 시스템 로캘 기준 | 보통 ANSI/CP949 | 레거시 국내 시스템 |
| 텍스트(탭으로 분리) | TSV | 로캘 기준 | ETL·로그형 데이터 |
10. PowerShell로 BOM 제거·변환
윈도우에서 대량 파일을 UTF-8(BOM 없음)으로 변환한다.
# 폴더 내 모든 CSV를 UTF-8(BOM 없음)으로 변환 Get-ChildItem "C:\data" -Filter *.csv | ForEach-Object { $t = Get-Content $_.FullName Set-Content -Path $_.FullName -Value $t -Encoding utf8 }
-Encoding utf8
은 BOM 없는 UTF-8을 생성한다. BOM이 필요한 경우
utf8BOM
을 사용한다.
11. 흔한 문제와 실무 해결 패턴
- 한글이 ???로 보임 : 파일은 UTF-8인데 자동열기로 ANSI로 인식된 경우이다. Power Query에서 65001로 지정하여 다시 가져온다.
- 이모지·특수문자 소실 : CP949로 저장된 데이터이다. 원본 재수집 또는 UTF-8로 변환 후 다시 가져온다.
- 열이 밀림 : 텍스트 내부의 쉼표가 한정자 없이 포함되었다. 소스에서 해당 필드를 쌍따옴표로 감싸도록 요구하거나, Power Query에서 QuoteStyle.Csv 로 처리한다.
- 날짜가 숫자/텍스트로 고정 : 가져오기 시 열 형식을 날짜로 지정하거나, 변환 단계에서 형식 변경 을 적용한다.
12. 체크리스트
| 항목 | 점검 방법 | 통과 기준 |
|---|---|---|
| 원본 인코딩 파악 | 에디터 상태바 확인 | UTF-8 또는 CP949로 식별 |
| 가져오기 경로 사용 | Power Query/마법사 사용 | 자동열기 미사용 |
| 인코딩 명시 | 65001/949 지정 | 깨짐 없음 |
| 구분자·한정자 | 쉼표·탭·쌍따옴표 확인 | 열 밀림 없음 |
| 열 형식 | 텍스트·날짜 지정 | 선행 0·형식 보존 |
| 재현 자동화 | 쿼리 저장·VBA | 원클릭 재로딩 |
13. 표준 운영 절차(SOP) 예시
1) 파일 수신 즉시 VS Code로 열어 인코딩·구분자 확인
2) 엑셀 > 데이터 > 텍스트/CSV에서 > 파일 원본=65001 또는 949 지정
3) 미리보기에서 열 제목·형식 확인 후 데이터 변환
4) Power Query 편집기에서 형식 지정(텍스트/날짜) 및 불필요 열 제거
5) 닫기 및 로드 > 로드 대상 선택(시트/데이터 모델)
6) 쿼리 속성에서 새로 고침 설정(파일 교체 시 자동 적재)
14. 샘플 데이터와 테스트
아래와 같은 레코드를 준비하여 각 인코딩으로 저장해 테스트하면 현장 적용 전에 리스크를 줄일 수 있다.
id,name,desc,price,created_at 00012,가나다,"쉼표, 포함된 설명",12000,2024-01-31 00013,테스트,"따옴표 ""중복"" 처리",0,2024-02-01
15. 문제 원인 트러블슈팅 트리
- 파일을 에디터로 열어 인코딩 확인한다.
- 엑셀에서 가져오기 경로를 사용하여 동일 인코딩을 지정한다.
- 깨짐 지속 시 다른 인코딩으로 시도한다(UTF-8↔CP949).
- 여전히 문제면 구분자·한정자·열 형식을 점검한다.
- 대량·반복이라면 Power Query 또는 VBA 자동화를 도입한다.
FAQ
CSV를 더블클릭으로 열면 깨지는데 해결 방법은 무엇인가?
더블클릭 자동열기를 중단하고, 엑셀에서 데이터 > 텍스트/CSV에서를 통해 인코딩을 명시하여 가져오는 것이 해결책이다.
UTF-8 파일인데 일부만 깨지는 이유는 무엇인가?
파일 내 특정 행에 한정자 누락이나 잘못된 구분자가 섞여 있으면 열 정렬이 틀어져 일부 필드만 깨져 보일 수 있다. 해당 필드를 따옴표로 감싸거나 Power Query에서 인코딩과 QuoteStyle을 지정한다.
공급받는 시스템이 CP949만 지원한다. 어떻게 해야 하나?
원본을 UTF-8로 관리하되 제공 직전에 CP949로 변환한다. 변환 후 표현 불가능한 문자가 있는지 점검한다.
날짜가 텍스트로 들어와 계산이 안 된다. 어떻게 처리하나?
가져오기 단계에서 해당 열을 날짜 형식으로 지정하거나, Power Query에서 형식 변경을 적용한다. 이미 로딩된 경우 TEXT/DATE 변환 함수를 사용한다.
선행 0이 사라진다. 왜 그런가?
일반 또는 숫자 형식으로 로딩되어 수치로 해석되었기 때문이다. 가져오기 시 열 형식을 텍스트로 지정한다.