JSON을 CSV로 변환한 후 중국어 깨짐 문제 해결 방법
JSON을 CSV로 변환한 후 중국어가 깨지는 근본 원인은 보통 인코딩 불일치입니다. 내보낼 때 시스템 기본 인코딩으로 쓰고, Excel은 UTF-8 바이트를 GBK로 해석하기 때문입니다. 해결책은 먼저 내보내기 인코딩이 UTF-8인지 확인한 다음, Excel이 이를 올바르게 인식하도록 하는 것입니다.
가장 간단한 방법은 CSV에 UTF-8 BOM(바이트 순서 표시)을 추가하는 것입니다. Excel은 BOM을 보면 자동으로 UTF-8로 엽니다. 브라우저에서 로컬로 실행되는 도구를 사용한다면 보통 내보내기 옵션에서 체크할 수 있습니다.
왜 깨짐이 발생하는가
CSV 자체는 순수 텍스트이며 인코딩 선언이 없습니다. 중국어가 올바르게 표시되는지는 쓰는 쪽과 읽는 쪽이 같은 인코딩을 사용하는지에 달려 있습니다.
쓰는 쪽이 UTF-8로 저장하고 읽는 쪽이 GBK로 해석하면 '锟斤拷' 또는 물음표가 나타납니다. 반대의 경우에도 깨집니다.
또 다른 경우는 데이터 자체에는 문제가 없지만 Excel에서 더블클릭으로 열 때 인코딩을 잘못 추측하는 것입니다. 메모장이나 코드로 읽으면 정상이라면 이는 표시 문제이지 데이터 손상이 아닙니다.
JSON을 CSV로 변환한 후 중국어 깨짐 문제 해결 방법
아래 순서대로 점검하면 대부분 처음 두 단계에서 해결됩니다.
- 내보내기 인코딩이 UTF-8인지 확인합니다. 내보내기 옵션에서 '인코딩' 또는 'Encoding'을 찾아 UTF-8을 선택합니다. 'UTF-8 with BOM'만 선택할 수 있다면 그것을 우선 선택합니다.
- BOM 추가합니다. BOM 없는 UTF-8로 내보냈다면 텍스트 편집기에서 'UTF-8 with BOM'으로 다른 이름 저장하거나, 도구가 BOM 포함 버전을 직접 내보내도록 합니다.
- 가져오기 방식으로 열기로 변경합니다. Excel에서 '데이터 - 텍스트/CSV에서'를 통해 수동으로 인코딩을 UTF-8로 선택하고, 파일을 더블클릭하지 않습니다.
- 원본 JSON의 인코딩 확인합니다. JSON 사양은 UTF-8을 요구하지만 일부 API는 GBK 인코딩 바이트 스트림을 반환합니다. 먼저 원본 데이터 인코딩을 확인한 후 변환 방식을 결정합니다.
- 필드 값에 잔여 이스케이프가 없는지 확인합니다. 중국어가
\u4e2d\u6587같은 유니코드 이스케이프로 작성된 경우 먼저 디코딩한 후 내보내야 하며, 그렇지 않으면 리터럴로 표시됩니다.
인코딩을 처리한 후에도 CSV가 여전히 비정상적으로 표시되면 파일을 16진수 뷰어로 열어 처음 세 바이트가 EF BB BF인지 확인합니다. 맞다면 BOM이 쓰인 것입니다.
JSON을 CSV로 변환하는 방법
기본 흐름은 세 단계입니다: JSON 읽기, 구조 평탄화, CSV 쓰기.
JSON은 중첩 객체와 배열을 허용하지만 CSV는 2차원 테이블만 있습니다. 따라서 첫 단계는 중첩 계층을 열 이름으로 펼치는 것입니다. 예를 들어 {"user":{"name":"张三"}}는 열 이름 user.name이 됩니다.
일반적인 방법은 다음과 같습니다:
- JSON 배열의 각 객체를 한 행으로 간주합니다.
- 모든 객체를 순회하며 나타난 모든 키를 수집하여 헤더로 사용합니다.
- 누락된 키는 빈 문자열로 채워 열을 정렬합니다.
- 값에 쉼표, 따옴표 또는 줄바꿈이 있으면 큰따옴표로 감싸고 내부 따옴표를 이스케이프합니다.
/tools에서 브라우저에서 로컬로 실행되는 도구를 찾을 수 있으며 데이터는 서버에 업로드되지 않습니다. 구체적인 도구 페이지는 JSON을 CSV로 변환 도구를 참조하세요.
JSON과 CSV의 차이
차이를 이해하면 변환 시 무엇이 손실되는지 판단하는 데 도움이 됩니다.
- 구조: JSON은 중첩 객체와 배열을 지원하지만 CSV는 평탄한 2차원 테이블만 지원합니다.
- 타입: JSON에는 문자열, 숫자, 불리언, null 등의 타입이 있지만 CSV는 모두 텍스트입니다.
- 인코딩: JSON 사양은 UTF-8을 요구하지만 CSV는 강제 규정이 없습니다.
- 크기: JSON은 키 이름과 괄호가 있어 일반적으로 동등한 CSV보다 큽니다.
- 용도: JSON은 API 전송에 적합하고 CSV는 표 보기와 대량 가져오기에 적합합니다.
변환의 대가는 중첩 정보가 평탄화된다는 것입니다. 배열 필드는 일반적으로 JSON 문자열로 직렬화되어 셀에 들어가거나 여러 행으로 분할됩니다.
JSON을 CSV로 변환 시 대용량 파일 처리
파일이 수십 MB를 초과하면 한 번에 메모리로 읽으면 브라우저 탭이 멈추기 쉽습니다.
더 안정적인 전략은 스트리밍 처리입니다: 청크 단위로 읽고 행 단위로 씁니다. 이렇게 하면 메모리 사용량이 단일 행 크기에만 관련되고 파일이 커져도 증가하지 않습니다.
또한 몇 가지 주의사항:
- 먼저 한 번 스캔하여 모든 키를 수집하여 나중에 새 키가 나타나 열이 어긋나는 것을 방지합니다.
- 대용량 파일 내보내기 시 실시간 미리보기를 꺼서 렌더링 오버헤드를 줄입니다.
- 여러 CSV로 나누어 내보내는 것이 하나의 초대형 파일보다 열기 쉽습니다.
- 브라우저 메모리가 여전히 부족하면 명령줄 도구로 전환합니다.
브라우저에서 로컬로 실행되는 도구는 대용량 파일 처리 시 탭 메모리 제한을 받으며 이는 환경에 의한 것이지 도구 결함이 아닙니다. 파일이 너무 크면 로컬 스크립트로 전환하는 것이 좋습니다.
API 디버깅 JSON을 CSV로 변환
API를 디버깅할 때 반환된 JSON을 빠르게 표로 변환하여 필드를 확인해야 하는 경우가 많습니다.
이때 중요한 것은 원본 구조를 유지하는 것이며 서둘러 평탄화하지 마세요. 먼저 응답을 .json 파일로 저장하고 인코딩과 완전성을 확인한 후 변환합니다.
몇 가지 실용적인 습관:
- 응답 저장 시 명시적으로 UTF-8을 사용하여 중간에 변경되지 않도록 합니다.
- 최상위가 객체인지 배열인지 먼저 확인합니다. 단일 객체는 먼저 배열로 감싼 후 변환합니다.
- 페이지네이션 필드에 주의하여 한 페이지만 변환하지 않도록 합니다.
- 필드 이름에 점이나 대괄호가 있으면 열 이름 충돌에 주의합니다.
변환 후 API 문서와 대조하여 열 이름을 확인하면 필드 누락이나 이름 변경을 빠르게 발견할 수 있습니다.
모바일 JSON을 CSV로 변환 설치 불필요
모바일에서 JSON을 처리할 때 앱을 설치하는 것이 웹을 사용하는 것보다 번거로운 경우가 많습니다.
브라우저에서 로컬로 실행되는 도구는 모바일에서도 사용할 수 있으며 어떤 앱도 설치할 필요가 없고 네트워크 업로드 데이터에도 의존하지 않습니다. 페이지를 열고 붙여넣거나 파일을 선택하고 내보내면 됩니다.
모바일의 제한은 주로 메모리와 파일 선택기에 있습니다. 초대형 파일은 모바일에서 처리하지 않는 것이 좋습니다. 내보낸 후 스프레드시트 앱으로 열 수 있으며 깨짐이 발생하면 마찬가지로 인코딩을 우선 확인하세요.
자주 묻는 질문
BOM을 추가해도 여전히 깨지면 어떻게 하나요
먼저 BOM이 실제로 쓰였는지 확인하고 16진수 뷰어로 처음이 EF BB BF인지 보세요. 쓰였는데도 깨지면 문제는 BOM이 아니라 데이터 소스 인코딩에 있습니다. JSON 소스로 돌아가 UTF-8인지 확인하세요.
메모장에서는 정상인데 Excel에서 깨짐
데이터는 정상이고 Excel이 인코딩을 잘못 추측한 것입니다. '데이터 - 텍스트/CSV에서' 가져오기로 변경하고 수동으로 UTF-8을 지정하세요. 파일을 더블클릭하지 마세요.
중국어가 \u4e2d\u6587 형태로 변함
이것은 유니코드 이스케이프 시퀀스이며 깨짐이 아닙니다. 변환 전에 먼저 디코딩하여 이스케이프를 실제 문자로 복원한 후 CSV를 작성해야 합니다.
배열 필드가 JSON 문자열로 변환됨
정상입니다. CSV에는 배열 타입이 없으므로 배열을 문자열로 직렬화하여 셀에 넣을 수밖에 없습니다. 펼쳐야 한다면 수동으로 여러 행으로 분할해야 합니다.
변환 후 행 수가 늘어남
대부분 배열 필드가 여러 행으로 펼쳐진 것입니다. 변환 설정에서 배열 처리 방식을 확인하고 '문자열로 직렬화' 또는 '여러 행으로 펼치기'를 선택하세요.
마무리
중국어 깨짐은 기본적으로 인코딩 통일로 해결할 수 있으며 UTF-8에 BOM을 추가하는 것을 우선하세요. JSON을 CSV로 변환한 후 중국어 깨짐 문제 해결 방법의 답은 결국 쓰는 쪽과 읽는 쪽이 같은 인코딩을 사용하고 Excel이 어느 인코딩을 사용해야 하는지 알게 하는 것입니다. 도구를 선택할 때는 브라우저에서 로컬로 실행되는 것을 우선 선택하면 데이터가 기기를 떠나지 않아 디버깅과 변환이 더 안심됩니다.