- 공유 링크 만들기
- X
- 이메일
- 기타 앱
이 글의 목적은 엑셀에서 디아크리틱 문자(á, é, ü, ñ, Ø 등)가 물음표·네모 상자·엉뚱한 조합 문자(예: “á”)로 깨지는 문제를 재현 가능한 절차로 진단하고, 데이터 가져오기 단계·인코딩·정규화·폰트·검색/정렬까지 포함한 종합 해결책을 제공하는 것이다.
1. 증상 분류와 원인 개요
엑셀에서 디아크리틱 문자가 깨지는 상황은 대체로 다음 네 가지로 분류되며, 각각 원인이 다르다.
| 증상 | 화면 예 | 주요 원인 |
|---|---|---|
| 인코딩 오인식 | “á”가 “á”, “é”가 “é”로 보임 | UTF-8 파일을 Windows-1252(ANSI)로 읽음 또는 CSV 파일 BOM 누락 |
| 폰트/글리프 부족 | 네모 상자(□), �, 빈칸 | 사용 폰트에 해당 글리프 없음, 글꼴 대체 실패 |
| 정규화 불일치 | 같아 보여도 비교 실패, 길이/문자수 다름 | NFD(분해형) vs NFC(정규형) 혼재, 주로 macOS/일부 시스템에서 유입 |
| 데이터 경로 문제 | 붙여넣기 후만 깨짐, 가져오기는 정상 또는 반대 | 브라우저/에디터/파워쿼리의 서로 다른 인코딩/정규화/클립보드 처리 |
U+00E9(단일 문자, NFC)와 U+0065 U+0301(e + 결합 악센트, NFD)는 겉보기로 같아도 엑셀 비교 결과가 다를 수 있다.2. 3분 점검 체크리스트
| 순서 | 점검 항목 | 합격 기준 |
|---|---|---|
| 1 | 원본 파일 인코딩 파악(CSV/TSV/JSON) | 가능하면 UTF-8 with BOM 또는 확실한 UTF-8 |
| 2 | 엑셀 가져오기 방법 | 더블클릭이 아닌 데이터 > 텍스트/CSV에서 가져오기 후 인코딩 수동 지정 |
| 3 | Power Query 인코딩 | 파일 원본 > 65001: UTF-8 선택 |
| 4 | 정규화 혼재 여부 | 유사 문자열 길이(LEN)·코드포인트 검사로 NFD 의심 시 정규화 |
| 5 | 폰트 | Calibri, Arial, Segoe UI, Noto Sans 등 라틴 확장 글리프 지원 폰트 적용 |
3. 인코딩 문제 해결: CSV/텍스트 파일 가져오기
3.1 “더블클릭 열기” 대신 데이터 탭으로 가져오기
파일을 곧바로 더블클릭하면 엑셀이 BOM이 없는 UTF-8을 ANSI로 오인식하는 경우가 있다. 다음 절차를 권장한다.
- 엑셀에서 데이터 > 텍스트/CSV에서를 클릭한다.
- 파일을 선택하면 미리보기 아래 파일 원본 드롭다운에서 65001: Unicode (UTF-8)을 선택한다.
- 필요 시 구분 기호(콤마/세미콜론/탭)를 맞추고 로드를 누른다.
3.2 레거시 텍스트 가져오기 마법사 활용
세밀한 제어가 필요하면 레거시 마법사를 활성화한다.
- 파일 > 옵션 > 데이터에서 레거시 마법사 표시의 텍스트에서 항목을 체크한다.
- 데이터 > 텍스트에서(레거시)를 실행하고 원본 파일에서 65001: UTF-8을 선택한다.
- 구분 기호, 열 데이터 형식을 지정해 로드한다.
3.3 원본을 확실한 UTF-8 with BOM으로 저장
엑셀이 자동으로 UTF-8을 인식하도록 원본에 BOM을 추가한다.
- 메모장: 파일 > 다른 이름으로 저장 > 인코딩: UTF-8(BOM 포함) 선택 후 저장한다.
- 파워셸 내보내기:
# PowerShell 5.x 권장: BOM 포함 UTF-8 Get-Content .\source.csv | Set-Content -Encoding UTF8 .\utf8_bom.csv - 파이썬 저장:
with open("utf8_bom.csv", "w", encoding="utf-8-sig", newline="") as f: f.write(text) 4. Power Query에서의 정확한 인코딩 지정
Power Query(데이터 > 데이터 가져오기)를 통해 파일을 불러올 때는 가져오기 단계에서 인코딩을 명시한다.
- 데이터 > 텍스트/CSV에서 > 파일 선택 후 변환 데이터 클릭
- Power Query 편집기에서 홈 > 원본 또는 쿼리 설정 > 소스를 클릭
- 파일 원본을 65001: UTF-8로 선택하고 적용
필요하면 로케일 기반 해석도 사용한다.
// Power Query(M)에서 로케일 활용 예시 = Csv.Document(File.Contents("C:\data\accents.csv"), [Delimiter=",", Columns=5, Encoding=65001, QuoteStyle=QuoteStyle.Csv]) 5. 정규화 문제 해결: NFC로 일관화
겉보기로 동일한 글자라도 코드포인트가 다르면 비교·정렬·중복 제거가 실패한다. 다음 절차로 진단 후 정규화한다.
5.1 진단: 코드포인트 확인
셀의 각 문자 코드포인트를 나열한다.
=TEXTJOIN(" ", TRUE, MAP(SEQUENCE(LEN(A2)), LAMBDA(k, UNICODE(MID(A2, k, 1))))) 같아 보이는 두 셀(A2, B2)의 LEN과 코드포인트 열을 비교한다. 하나는 233(é) 하나는 101 769(e + 결합 악센트)처럼 다를 수 있다.
5.2 정규화 전략
엑셀에는 직접적인 “정규화 함수”가 없다. 다음 중 하나를 선택한다.
- Power Query로 정규화: 분해형(NFD) 유입이 반복되면 파워쿼리 단계에서 대체 값 또는 사용자 지정 함수로 교정한다.
- 보조열로 악센트 제거(검색/정렬용): 디아크리틱을 제거한 보조열을 만들어 비교·검색·정렬에 사용한다.
5.3 보조열로 악센트 제거(함수 버전)
라틴-1 범주를 중심으로 자주 쓰는 문자만 매핑해도 현업에는 충분한 경우가 많다. 아래는 LET과 REDUCE를 사용한 간단 매핑 예시이다.
=LET( s, A2, acc, {"á","à","â","ä","ã","å","Á","À","Â","Ä","Ã","Å", "é","è","ê","ë","É","È","Ê","Ë", "í","ì","î","ï","Í","Ì","Î","Ï", "ó","ò","ô","ö","õ","Ó","Ò","Ô","Ö","Õ", "ú","ù","û","ü","Ú","Ù","Û","Ü", "ñ","Ñ","ç","Ç","ø","Ø","ß"}, plain,{"a","a","a","a","a","a","A","A","A","A","A","A", "e","e","e","e","E","E","E","E", "i","i","i","i","I","I","I","I", "o","o","o","o","o","O","O","O","O","O", "u","u","u","u","U","U","U","U", "n","N","c","C","o","O","ss"}, REDUCE(s, SEQUENCE(ROWS(acc)), LAMBDA(t,i, SUBSTITUTE(t, INDEX(acc,i), INDEX(plain,i)))) ) 이 보조열을 기준으로 정렬, 중복 제거, VLOOKUP/XLOOKUP을 수행하면 정규화 불일치의 영향을 줄일 수 있다.
6. 붙여넣기·클립보드 경로 최적화
웹 페이지나 PDF에서 바로 붙여넣을 때 디아크리틱이 깨지면 다음을 적용한다.
- 붙여넣기 옵션: 붙여넣은 후 셀에 나타나는 아이콘에서 값만 또는 유지되지 않은 서식을 선택한다.
- 중간 에디터 경유: 메모장에 먼저 붙여넣고 UTF-8(BOM)으로 저장한 뒤 데이터 탭에서 가져온다.
- 브라우저 인쇄>PDF>복사는 결합 문자 삽입 가능성이 높다. 가능하면 원본 데이터 파일을 확보한다.
7. 폰트 점검과 교체
라틴 확장 범위를 충분히 지원하는 폰트를 사용한다. Calibri, Arial, Segoe UI, Noto Sans/Serif, Arial Unicode MS 등이 안전하다. 범용이 아닌 장식 폰트는 결합 문자를 잘못 렌더링하기도 한다.
8. 검색, 비교, 정렬의 정확도 높이기
8.1 악센트 무시 검색
원본 열(A:A) 옆에 보조열(악센트 제거)을 만든 뒤 다음처럼 검색한다.
=XLOOKUP( [악센트제거(검색어)], [악센트제거(키 범위)], 반환범위 ) 동적 배열 함수가 없다면 VLOOKUP과 동일한 보조열 기준으로 구현한다.
8.2 정렬 및 중복 제거
정렬과 중복 제거는 원본 대신 보조열을 기준으로 수행한다. 파워쿼리를 사용하면 변환 > 형식 > 소문자/대문자 후 보조열 기준으로 정렬/중복제거를 설정한다.
9. VBA로 대량 정규화/치환 자동화
반복 작업이라면 간단한 VBA 매핑으로 속도를 높인다.
Option Explicit
Private Type Pair
a As String
b As String
End Type
Public Sub StripDiacriticsRange()
Dim m() As Pair, i As Long
Dim rng As Range, c As Range
m = MapAccents()
Set rng = Application.Selection
Application.ScreenUpdating = False
For Each c In rng.Cells
Dim s As String: s = CStr(c.Value2)
For i = LBound(m) To UBound(m)
s = Replace(s, m(i).a, m(i).b, 1, -1, vbBinaryCompare)
Next
c.Value2 = s
Next
Application.ScreenUpdating = True
End Sub
Private Function MapAccents() As Pair()
Dim acc, plain, i As Long, n As Long
acc = Array("á","à","â","ä","ã","å","Á","À","Â","Ä","Ã","Å", _
"é","è","ê","ë","É","È","Ê","Ë", _
"í","ì","î","ï","Í","Ì","Î","Ï", _
"ó","ò","ô","ö","õ","Ó","Ò","Ô","Ö","Õ", _
"ú","ù","û","ü","Ú","Ù","Û","Ü", _
"ñ","Ñ","ç","Ç","ø","Ø","ß")
plain = Array("a","a","a","a","a","a","A","A","A","A","A","A", _
"e","e","e","e","E","E","E","E", _
"i","i","i","i","I","I","I","I", _
"o","o","o","o","o","O","O","O","O","O", _
"u","u","u","u","U","U","U","U", _
"n","N","c","C","o","O","ss")
n = UBound(acc) - LBound(acc) + 1
ReDim p(0 To n - 1) As Pair
For i = 0 To n - 1
p(i).a = CStr(acc(i))
p(i).b = CStr(plain(i))
Next
MapAccents = p
End Function
10. 파일 입출력 파이프라인별 권장 설정
| 파이프라인 | 권장 설정 | 비고 |
|---|---|---|
| CSV → 엑셀 | UTF-8 with BOM 저장 → 엑셀 데이터 > 텍스트/CSV에서 UTF-8 선택 | 더블클릭 금지 |
| DB → Power Query → 엑셀 | 드라이버/연결 문자열에서 UTF-8 또는 적절한 코드페이지 명시 | 미리보기 단계에서 글자 깨짐 확인 |
| 웹 → 엑셀 | 웹에서 CSV/JSON 직접 다운로드 후 데이터 탭으로 가져오기 | 브라우저 복사-붙여넣기는 비권장 |
| 파워셸 Export-CSV | -Encoding UTF8 사용, 필요 시 BOM 확인 | 버전에 따라 BOM 처리 다름 |
| 파이썬 pandas | to_csv(..., encoding="utf-8-sig") | BOM 포함 |
11. 데이터 유효성 점검: 깨짐 탐지 자동화
유입 데이터에 깨짐이 있는지 빠르게 점검한다.
=LET( s, A2, suspicious, OR(ISNUMBER(SEARCH("Ã", s)), ISNUMBER(SEARCH("�", s))), IF(suspicious, "인코딩 점검", "정상") ) 또는 결합 문자 존재 여부를 코드포인트로 판정한다.
=LET( s, A2, arr, MAP(SEQUENCE(LEN(s)), LAMBDA(k, UNICODE(MID(s,k,1)))), IF(SUM(--(arr>=768))>0, "결합문자 존재", "없음") ) 12. 실제 시나리오별 솔루션
시나리오 A. “á/é/ö”로 보인다
- 원본 CSV를 메모장으로 열어 UTF-8로 다시 저장(BOM 포함)한다.
- 엑셀에서 데이터 > 텍스트/CSV로 UTF-8을 강제 지정하여 로드한다.
시나리오 B. 네모 상자나 �가 보인다
- 셀 범위를 선택하고 폰트를 Calibri 또는 Noto Sans로 바꾼다.
- 여전히 안 되면 원본 파일 인코딩을 재점검한다.
시나리오 C. 같은 것처럼 보이는데 매칭 실패
LEN·코드포인트 검사로 NFD 여부를 파악한다.- 보조열(악센트 제거)로 키를 생성해
XLOOKUP을 수행한다. - 장기적으로는 데이터 유입 단계에서 NFC 일관화를 확립한다.
13. 운영 표준안(팀 배포용)
- 원칙 1: 외부 텍스트 파일 교환은 UTF-8 with BOM을 표준으로 한다.
- 원칙 2: 엑셀에서 텍스트 파일은 항상 데이터 탭을 통해 인코딩을 지정하여 가져온다.
- 원칙 3: 라틴 확장 글리프를 지원하는 공용 폰트만 사용한다.
- 원칙 4: NFD 유입 가능 경로(macOS, 일부 앱)에서 정규화 테스트를 배치한다.
- 원칙 5: 검색·정렬·매칭은 악센트 제거 보조열을 병행한다.
14. 문제 해결 플로우차트
[깨짐 발생] | +-- 더블클릭 열기? -- 예 --> 데이터 탭 가져오기로 재시도(UTF-8 지정) | | | +-- 해결? -- 예 --> 종료 | | | 아니오 | +-- 폰트 변경(Calibri/Noto) --> 해결? -- 예 --> 종료 | | | 아니오 | +-- 코드포인트 검사(LEN/UNICODE) -- 결합문자? -- 예 --> 보조열 정규화 | | | +-- 매칭/정렬 재시도 | +-- Power Query 인코딩 재지정(65001) → 로드 FAQ
엑셀에서 직접 악센트를 보존한 채 CSV로 저장하려면 어떻게 하나?
파일 > 다른 이름으로 저장 > CSV UTF-8(쉼표로 분리)(*.csv) 형식을 선택한다. 이렇게 저장하면 UTF-8 with BOM으로 저장되어 다른 시스템에서도 깨짐이 줄어든다.
정규화(NFC/NFD)를 엑셀 함수만으로 완벽히 처리할 수 있나?
엑셀 기본 함수만으로는 완전한 유니코드 정규화를 제공하지 않는다. 실무에서는 보조열 매핑(치환) 방식 또는 Power Query 단계의 사용자 지정 처리를 사용한다.
검색 시 악센트를 무시하고 일치시키려면?
검색어와 대상 열 모두에 동일한 악센트 제거 함수를 적용한 보조열을 만든다. 이후 XLOOKUP, FILTER, MATCH 등을 보조열 기준으로 수행한다.
Office 언어 팩 설치가 필요할 때가 있나?
교정 도구나 특정 스크립트 언어 사용자라면 언어 팩을 추가하는 것이 권장된다. 다만 글리프 표시 문제는 대개 폰트로 해결 가능하다.
“?”로 보이는데 인코딩을 바꾸어도 해결되지 않는다.
원본 생성 시 이미 손실이 발생했을 가능성이 있다. 생성 애플리케이션에서 UTF-8로 재생성하거나 상위 소스 데이터를 확보해야 한다.