JSON을 엑셀로: CSV 한글 깨짐과 쉼표·줄바꿈 처리
2026.10.03 업데이트 · 6분 읽기
JSON을 엑셀에서 열려면 UTF-8 BOM이 붙은 CSV로 바꾸는 것이 가장 간단합니다. 한글이 깨지는 이유, 쉼표·따옴표·줄바꿈이 든 값을 감싸는 규칙, 앞자리 0이 사라지는 문제를 정리했습니다.
JSON ↔ CSV 변환 바로 사용하기JSON 데이터를 엑셀에서 보려면 CSV로 바꾸는 것이 가장 간단합니다. 객체 배열을 행으로 풀고, 파일을 BOM이 붙은 UTF-8로 저장하고, 쉼표·큰따옴표·줄바꿈이 든 값은 큰따옴표로 감싸면 됩니다. BOM은 한글이 깨지지 않게 하고, 따옴표 규칙은 값이 다른 칸으로 밀리지 않게 합니다. JSON ↔ CSV 변환은 이 규칙을 기본값으로 적용합니다.
JSON을 행과 열로 바꾸기
표는 같은 열을 가진 행의 모음이므로 입력은 객체 배열이어야 합니다. 객체 하나가 한 행, 키 하나가 한 열이 됩니다.
- 열 순서: 키가 처음 나온 순서입니다. 뒤 객체에서 처음 나오는 키는 오른쪽에 추가되고, 그 키가 없는 행은 빈칸이 됩니다.
- 중첩 객체: 기본은 점 경로로 펼칩니다.
{"a":{"b":1}}은a.b열이 됩니다. 중첩 객체를 JSON 문자열 그대로 한 칸에 넣는 방식도 고를 수 있습니다. - 배열 값: JSON 문자열로 한 칸에 들어갑니다.
- 그 밖의 모양:
{"a":1}같은 객체 하나는 한 행으로 처리합니다."text"같은 값은 표가 될 수 없어 「CSV 표로 바꿀 수 없는 JSON입니다」가 표시됩니다.
키가 서로 다른 객체 두 개로 앞의 두 규칙을 함께 볼 수 있습니다.
입력 [{"a":{"b":1}},{"c":2}]
출력 a.b,c
1,
,2
직접 만든 변환 코드에서 칸에 [object Object]가 찍히는 것은 JavaScript가 객체를 직렬화 없이 글자로 바꿨기 때문이고, 이렇게 펼치면 생기지 않습니다.
쉼표·따옴표·줄바꿈
CSV에는 공식 표준이 없습니다. RFC 4180은 대부분의 구현이 따르는 형식을 기록한 정보성 문서이고, 까다로운 값에 대한 규칙은 짧습니다.
- 줄바꿈, 큰따옴표, 쉼표가 든 필드는 큰따옴표로 감쌉니다.
- 그 안의 큰따옴표는 두 번 써서 이스케이프합니다.
- 레코드는 한 줄에 하나씩 쓰고 줄바꿈은 CRLF입니다.
실제 데이터에 적용하면 이렇습니다.
입력 [{"id":1,"name":"Kim, Jr."},{"id":2,"name":"이\"민\""}]
출력 id,name
1,"Kim, Jr."
2,"이""민"""
첫 이름에는 쉼표가 있어 따옴표로 감쌌고, 덕분에 셋째 칸으로 밀리지 않습니다. 둘째 이름에는 큰따옴표가 있어 값을 감싸고 안쪽 따옴표를 두 번 썼습니다. 끝의 따옴표 세 개는 두 번 쓴 따옴표 하나와 닫는 따옴표입니다. 특수 문자가 없는 값은 감싸지 않습니다.
따옴표 안의 줄바꿈은 값의 일부입니다. 엑셀은 여러 줄짜리 칸으로 보여 주지만, 파일을 줄 단위로 자르는 단순한 스크립트는 레코드를 둘로 쪼갭니다. 값을 쉼표로 이어 붙여 CSV를 만들면 안 되는 이유입니다. 주소나 메모 칸에 쉼표와 줄바꿈이 들어오는 순간 깨집니다.
엑셀에서 한글이 깨지는 이유와 BOM
CSV 파일에는 인코딩을 알려 주는 표시가 없습니다. UTF-8 BOM은 파일 맨 앞에 쓰는 문자 U+FEFF이고, RFC 3629에 따르면 세 바이트 EF BB BF입니다. 「이 파일은 UTF-8」이라는 서명 역할을 합니다.
Microsoft 지원 문서는 UTF-8로 인코딩된 CSV 파일은 BOM과 함께 저장된 경우 정상적으로 열 수 있다고 설명합니다. BOM이 없으면 「데이터」 탭에서 「텍스트/CSV에서」로 가져오거나 텍스트 가져오기 마법사를 쓰라고 안내합니다.
서명이 없으면 같은 바이트를 예전 지역별 인코딩으로 읽을 수 있고, 그러면 ASCII가 아닌 글자가 모두 깨집니다. UTF-8 바이트를 한국어 Windows의 기존 인코딩인 CP949로 해석해 보면 이렇게 됩니다.
| UTF-8로 쓴 글 | 바이트 | CP949로 읽은 결과 |
|---|---|---|
주문 |
EC A3 BC EB AC B8 |
二쇰Ц |
근무 |
EA B7 BC EB AC B4 |
洹쇰Т |
한 글자에 3바이트인 UTF-8 한글을 2바이트씩 끊어 읽어서 한자와 엉뚱한 글자가 섞여 나옵니다.
데이터가 손상된 것은 아닙니다. 파일은 올바른 UTF-8이고 읽는 방식만 틀렸으므로, BOM을 붙이거나 인코딩을 지정해 가져오면 해결됩니다.
도구에서는 내려받는 파일에 UTF-8 BOM을 붙이는 옵션이 기본으로 켜져 있습니다. CSV를 엑셀이 아닌 다른 프로그램에 넘길 때는 끄세요. BOM을 예상하지 않는 파서는 이 문자를 첫 열 이름에 붙은 보이지 않는 글자로 다룰 수 있습니다. JSON은 반대여서, RFC 8259는 네트워크로 전송하는 JSON 앞에 BOM을 붙이면 안 된다고 정합니다. BOM으로 시작하는 파일을 도구에서 열면 BOM을 떼고 「BOM 제거됨」을 표시합니다.
열고 난 뒤 엑셀이 바꾸는 값
CSV가 올바르더라도 엑셀이 숫자나 날짜로 보이는 값을 자동으로 바꿉니다. Microsoft 문서가 밝히는 자동 변환은 다음과 같습니다.
- 앞에 오는 0을 제거합니다.
007은 7이 됩니다. - 큰 숫자를 1.23E+15 같은 과학적 표기법으로 바꾸고, 숫자 데이터를 15자리 정밀도로 자릅니다. 긴 ID나 카드 번호처럼 자릿수가 많은 값이 달라집니다.
- 숫자 사이에 문자 E가 있는 값을 과학적 표기법으로 바꿉니다.
- 문자와 숫자가 이어진 일부 값을 날짜로 바꿉니다.
파일에는 원래 글자가 그대로 있고, 엑셀이 읽으면서 바꾸는 것입니다. 이런 열을 그대로 두려면 더블클릭으로 열지 말고 가져오기를 쓰세요. 문서의 안내는 「데이터」 탭에서 「텍스트/CSV에서」를 고르고, 미리 보기에서 편집으로 들어가 해당 열의 데이터 형식을 텍스트로 지정하는 것입니다. 메뉴 이름은 엑셀 버전에 따라 다를 수 있습니다. 2026년 10월 기준 같은 문서는 Microsoft 365용 Excel과 Excel 2024에 이 동작을 끄는 자동 데이터 변환 설정이 있다고 안내합니다.
반대 방향에도 같은 함정이 있습니다. 도구에서 CSV를 JSON으로 바꿀 때는 숫자 추론이 기본으로 꺼져 있어서, 다음 CSV는
id,zip
1,007
[{"id": "1", "zip": "007"}](한 줄로 줄여 적음)이 되고 우편번호가 문자열 그대로 남습니다.
증상별 해결
| 엑셀에서 보이는 증상 | 원인 | 해결 |
|---|---|---|
| 한글이 깨져 보임 | BOM 없는 UTF-8 파일 | BOM을 붙여 저장하거나 「데이터」 탭에서 가져오기 |
| 값이 옆 칸으로 밀림 | 감싸지 않은 값 안의 쉼표 | 필드를 큰따옴표로 감싸기 |
| 한 레코드가 여러 행으로 나뉨 | 감싸지 않은 값 안의 줄바꿈 | 필드를 큰따옴표로 감싸기 |
007이 7로, 긴 번호가 1.23E+15로 |
엑셀의 자동 숫자 변환 | 해당 열을 텍스트로 가져오기 |
칸에 [object Object] |
직렬화하지 않은 중첩 객체 | 점 경로로 펼치거나 JSON 문자열로 쓰기 |
ZEKILO Dev로 변환하기
- JSON ↔ CSV 변환에 JSON을 붙여 넣거나
.json파일을 엽니다. - 필요하면 구분자(쉼표·세미콜론·탭·세로선), 중첩 객체 처리, 줄바꿈(CRLF·LF), UTF-8 BOM 옵션을 바꿉니다.
.csv파일을 내려받아 엑셀에서 엽니다.
변환은 브라우저 안에서 이루어지며 데이터는 서버로 보내지 않습니다.
정리
- 객체 배열을 CSV로 바꿉니다. 중첩 객체는 점 경로 열이 됩니다.
- 쉼표·큰따옴표·줄바꿈이 든 값은 큰따옴표로 감싸고 안쪽 따옴표는 두 번 씁니다(RFC 4180).
- 엑셀용 파일은 BOM(
EF BB BF)이 붙은 UTF-8로 저장하면 더블클릭으로 열어도 한글이 깨지지 않습니다. 다른 프로그램에 넘길 때는 BOM을 뺍니다. - 우편번호나 긴 ID 같은 열은 텍스트로 가져와야 엑셀이 값을 바꾸지 않습니다.