엑셀 한글이 물음표로 깨질 때 완전 해결법(UTF-8·CP949 인코딩, CSV 저장, 파워쿼리 설정 총정리)

이 글의 목적은 엑셀에서 한글이 ‘???’ 또는 ‘?�’처럼 물음표로 표시되거나 깨지는 문제를 인코딩·저장 방식·가져오기 경로별로 정확히 진단하고, 재발 방지까지 포함한 실무형 해결 절차를 제공하는 것이다.

왜 한글이 물음표로 깨지는가

대부분의 경우 파일 인코딩 불일치 또는 비유니코드 저장으로 인한 문자 손실 때문이다. 엑셀 구버전 또는 특정 저장 형식은 유니코드가 아닌 코드페이지(예: CP949, EUC-KR)를 사용하며, 이때 해당 코드페이지에 없는 문자는 저장 시 물음표로 치환된다. 한 번 물음표로 저장된 문자는 원문 복원이 불가능하다. 따라서 증상 발생 지점을 정확히 특정하고 올바른 인코딩으로 다시 열거나, 최초부터 유니코드 저장 형식을 선택해야 한다.

증상 주요 원인 핵심 조치
셀에 ‘???’로 보임 CSV를 ANSI/CP949 등 비유니코드로 저장하며 손실 발생 원본 데이터 재확보 후 ‘CSV UTF-8(쉼표로 분리)’로 저장한다
‘�’(물음표 박스) 또는 깨진 글자 열기 시 인코딩 자동판별 실패 데이터>텍스트/CSV에서 파일 원본 인코딩을 수동 지정한다
특정 글자만 ‘?’로 치환 해당 글자가 코드페이지에 없음 항상 유니코드 형식(xlsx, UTF-8 CSV)으로 취급한다
외부 시스템 내보낸 CSV에서만 발생 시스템이 EUC-KR, Shift-JIS 등으로 내보냄 가져오기 시 동일 인코딩 지정 후 xlsx로 저장한다
주의 : ‘?’로 저장된 파일은 정보가 이미 소실된 상태이다. 소실 전 원본 또는 백업에서 재작업해야 한다.

가장 빠른 정석 절차(Windows용 Microsoft 365/Excel 2019+ 기준)

  1. 엑셀에서 데이터 > 텍스트/CSV에서 파일을 선택한다.
  2. 미리보기 창 하단의 파일 원본(인코딩) 65001: UTF-8 또는 실제 소스 인코딩(EUC-KR, CP949 등)으로 바꾼다.
  3. 구분 기호(쉼표, 탭 등)를 확인하고 로드 또는 로드 대상 을 눌러 표로 불러온다.
  4. 불러온 뒤 즉시 파일 > 다른 이름으로 저장 에서 Excel 통합 문서(.xlsx) 로 저장한다.
주의 : CSV를 더블클릭하여 바로 여는 동작은 인코딩 자동 판별 실패 가능성이 크다. 반드시 데이터 탭의 가져오기를 사용한다.

엑셀 버전에 따른 CSV 인코딩 차이

엑셀 버전 CSV 저장 기본 인코딩 UTF-8 CSV 메뉴 권장 대응
Microsoft 365 / 2019+ 레거시 CSV는 비유니코드일 수 있다 ‘CSV UTF-8(쉼표로 분리)’ 제공 항상 CSV UTF-8로 저장한다
2016 기본 CSV는 ANSI 계열 업데이트에 따라 제공 CSV UTF-8이 없다면 xlsx로 유지하거나 파워쿼리/스크립트로 변환한다
2013 및 이하 ANSI 계열 없음 가능하면 상위 버전 사용 또는 매크로/외부도구로 UTF-8 저장한다

원인별 정밀 진단 체크리스트

  1. 원본 인코딩 파악 을 우선한다. 외부 시스템 사양서, API 응답 헤더, 내보내기 옵션을 확인한다.
  2. 파일을 메모장 또는 코드편집기 로 열어 ‘다른 이름으로 저장’ 시 인코딩 힌트를 본다.
  3. 파일 크기 비교 를 한다. UTF-8 BOM 포함 CSV는 파일 시작에 3바이트가 추가된다.
  4. 물음표가 저장 후 생겼는지 또는 열기 시에만 보이는지 를 구분한다. 저장 후라면 복구 불가이므로 원본 재확보가 필요하다.

파워쿼리로 안전하게 가져오기

  1. 데이터 > 텍스트/CSV에서 파일 선택 후 데이터 변환 을 누른다.
  2. 파워쿼리 편집기에서 홈 > 파일 원본 설정 또는 원본 단계 를 열어 인코딩 을 명시한다.
  3. 열 유형을 텍스트로 강제 후 필요한 변환을 적용한다.
  4. 닫기 및 로드 로 시트에 배치한다.
주의 : 파워쿼리에서 인코딩을 지정하지 않으면 자동 추정이 적용되어 간헐적 오판이 발생할 수 있다.

CSV 저장 시 절대 수칙

  • 파일 > 다른 이름으로 저장 > CSV UTF-8(쉼표로 분리) 을 사용한다.
  • CSV를 편집 용도로 재사용하지 않는다 . 편집은 항상 xlsx 원본에서 수행하고, 배포 단계에서만 CSV UTF-8로 내보낸다.
  • 외부 시스템이 CP949만 허용한다면, UTF-8에서 CP949로 변환 시 손실 가능 문자를 사전 점검한다.

손실 없이 인코딩 변환하기(Windows PowerShell)

다음 예시는 CP949로 된 CSV를 UTF-8(무BOM)으로 변환한다.

  
# 관리자 권한이 필요하지 않다 $in = "C:\data\source_cp949.csv" $out = "C:\data\converted_utf8.csv"
$bytes = [System.IO.File]::ReadAllBytes($in)
$encSrc = [System.Text.Encoding]::GetEncoding(949) # CP949
$encDst = New-Object System.Text.UTF8Encoding($false) # UTF-8 no BOM
$text = $encSrc.GetString($bytes)
[System.IO.File]::WriteAllText($out, $text, $encDst)

  

UTF-8 BOM이 필요한 시스템이라면 마지막 줄의 UTF-8 인코딩 생성을 New-Object System.Text.UTF8Encoding($true) 로 바꾸면 된다.

메모장으로 빠르게 재인코딩하기

  1. 문제를 일으킨 CSV를 메모장으로 연다.
  2. 파일 > 다른 이름으로 저장 을 선택한다.
  3. 인코딩 에서 UTF-8 또는 ANSI (소스 인코딩과 일치)로 저장한다.
주의 : 이미 ‘?’로 치환된 파일을 다른 인코딩으로 다시 저장해도 문자는 복구되지 않는다.

VBA로 UTF-8 CSV 저장 자동화(구버전 호환)

엑셀 2013 이하 또는 CSV UTF-8 메뉴가 없는 환경에서 다음 매크로로 현재 시트를 UTF-8 CSV로 저장할 수 있다.

  
Sub SaveAsUtf8Csv() Dim f As Integer, p As String, s As String Dim r As Range, rowArr() As String, colArr() As String p = ThisWorkbook.Path & "\export_utf8.csv" f = FreeFile Open p For Binary As #f ' UTF-8 BOM을 원하면 다음 3바이트를 쓰기: &HEF, &HBB, &HBF ' Put #f, , ChrW$(&HEF) & ChrW$(&HBB) & ChrW$(&HBF) For Each r In ActiveSheet.UsedRange.Rows ReDim colArr(1 To r.Columns.Count) Dim c As Range, i As Long i = 1 For Each c In r.Columns colArr(i) = Replace(CStr(c.Value), """", """""") i = i + 1 Next c s = """" & Join(colArr, """,""") & """" Put #f, , StrConv(s & vbCrLf, vbFromUnicode) Next r Close #f MsgBox "Saved: " & p End Sub 
  
주의 : 위 예시는 간단화를 위해 따옴표 이스케이프와 줄바꿈만 처리한다. 대용량·복잡 구분 기호는 파워쿼리 또는 외부 스크립트를 권장한다.

외부 시스템 통합 시 체크포인트

  • API 응답 헤더의 Content-Type; charset 를 확인하여 파워쿼리 웹 커넥터에 동일하게 반영한다.
  • DB 덤프는 UTF-8 로 내보내고, 쉼표 포함 텍스트는 반드시 따옴표로 감싼다.
  • SFTP 배포 시 파일명에 .utf8.csv 또는 .cp949.csv 접미사를 부여하여 인계 오류를 줄인다.

열기 대신 가져오기를 강제하는 운영 팁

  1. CSV를 기본 연결 앱에서 엑셀 대신 코드 편집기로 열리게 설정하여 더블클릭 오열기를 방지한다.
  2. 사내 지침서에 데이터 > 텍스트/CSV 경로를 표준으로 명시한다.
  3. 배포 전 CSV를 샘플 검증 스크립트로 열고 한글 범위 유효성을 검사한다.

실패 사례별 즉시 처방

상황 오류 지점 해결 재발 방지
CSV 열자마자 ‘???’ 이미 비유니코드로 저장됨 원본 재수급 후 UTF-8로 다시 저장 편집은 xlsx, 배포만 UTF-8 CSV
ERP 내보낸 CSV만 깨짐 ERP가 EUC-KR로 내보냄 가져오기 시 EUC-KR 지정 ERP 출력 인코딩 옵션 조정
파이프라인 중간에 물음표화 중간 변환기가 ANSI 저장 중간 단계 스크립트 인코딩 강제 전 단계 UTF-8 계약서 표준화

Windows ‘전역 언어 지원을 위해 UTF-8 사용’ 옵션에 대한 오해 정리

해당 옵션은 레거시 비유니코드 앱의 코드페이지 동작을 바꾸는 설정이다. 엑셀의 CSV 인코딩 판별이나 저장 형식을 자동으로 고치지 않는다. 조직 표준을 UTF-8 중심으로 전환하는 것이 효과적이다.

대량 파일 일괄 변환 예시(PowerShell)

  
$src = "C:\in" $dst = "C:\out" $encSrc = [System.Text.Encoding]::GetEncoding(949) # 필요 시 65001 등으로 조정 $encDst = New-Object System.Text.UTF8Encoding($false)
Get-ChildItem $src -Filter *.csv | ForEach-Object {
$bytes = [System.IO.File]::ReadAllBytes($.FullName)
$text = $encSrc.GetString($bytes)
$out = Join-Path $dst $.Name
[System.IO.File]::WriteAllText($out, $text, $encDst)
}

  

엑셀에서 기본 ‘레거시 텍스트 마법사’ 사용하기

  1. 파일 > 옵션 > 데이터 에서 레거시 가져오기 마법사 표시 를 켠다.
  2. 데이터 > 텍스트/CSV 가져오기(레거시) 를 선택한다.
  3. 단계별로 파일 원본 에서 EUC-KR, UTF-8 등을 정확히 선택한다.

문자 손실 위험 문자 목록 관리

CP949에 없는 기호, 한글 호환 자모, 일부 이모지 등은 ANSI 저장 시 필연적으로 물음표로 손실된다. 표준 문서 템플릿에서는 해당 문자 사용을 제한하거나 대체 문자를 정의해야 한다.

팀 운영 체크리스트

  • 문서 수집·가공·배포 단계별 인코딩 표준 을 정의한다.
  • 원본은 영구히 xlsx 로 보관하고 CSV는 일회성 산출물로 취급한다.
  • 배포 전 샘플 레코드에 초성·종성·확장 한자·특수기호를 포함하여 인코딩 감시 표본 을 검사한다.

FAQ

이미 ‘???’로 저장된 CSV에서 원문을 복구할 수 있나

불가능하다. 물음표는 저장 시점에 정보가 소실된 결과이다. 원본 시스템에서 다시 내보내거나 백업본을 사용해야 한다.

CSV를 더블클릭해도 항상 올바르게 열 방법이 있나

보장할 수 없다. 엑셀의 자동 인코딩 판별은 완벽하지 않다. 데이터 탭의 텍스트/CSV 가져오기 또는 파워쿼리를 표준화해야 한다.

UTF-8로 저장했는데 여전히 깨지는 것은 무엇 때문인가

상대 시스템이 UTF-8을 지원하지 않거나, 구분 기호·따옴표 규칙 불일치로 파싱이 틀어진 경우가 많다. 상대 시스템 사양을 확인하고 필요 시 BOM 포함 UTF-8로 저장한다.

폰트 문제로 물음표가 생길 수 있나

일반적으로 폰트 문제는 사각형 박스나 빈칸으로 보이는 현상이다. 물음표는 인코딩 손실일 확률이 높다.

외부 웹에서 다운받은 CSV가 매번 깨진다. 상수 해결책이 있나

파워쿼리에서 원본 인코딩을 고정하고 쿼리를 재사용한다. 또는 브라우저 확장·스크립트로 다운로드 직후 UTF-8로 일괄 변환한다.