내보낸 CSV 파일에 깨진 문자가 표시됩니다

사용자 목록을 CSV 형식으로 내보낼 때, name 필드에 ASCII 문자와 숫자 이외의 문자가 포함되어 있으면 문자가 깨져 보입니다:
image

이 문제를 해결하기 위한 두 가지 방법을 찾았습니다:

  1. Excel에서 새로운 XLSX 파일을 생성한 후, “텍스트/CSV에서” 옵션을 사용하여 데이터를 가져오고, 파일 원본(File Origin)을 Unicode (UTF-8)으로 조정합니다.


    image

  2. Notepad++를 사용하여 CSV 파일을 열고, 인코딩(Encoding)을 UTF-8에서 UTF-8-BOM으로 변경합니다.

결과:

이 두 가지 방법은 증상을 해결하는 데 효과적이지만, 근본 원인을 다루지는 않습니다.


추가 조사를 통해 이 문제에 대한 장기적인 해결책을 발견했습니다:

// CSV 생성 과정으로, 'body'는 데이터 행을, 'header'는 헤더 행을 나타냅니다.
const csv = body.reduce((prev, current) => `${prev}\r\n${current}`, header);

// Excel은 파일이 UTF-8로 인코딩되었음을 나타내기 위해 바이트 순서 마크(BOM)가 필요합니다.
const BOM = Buffer.from('\uFEFF');

// BOM 헤더를 생성된 CSV 콘텐츠 앞에 연결합니다.
const bomCsv = Buffer.concat([BOM, Buffer.from(csv)]);

// 결과 버퍼를 문자열로 변환하여 반환합니다.
return bomCsv.toString();

// 반환된 문자열을 다운로드하여 Excel로 열면, 스프레드시트에 중국어 콘텐츠가 올바르게 표시됩니다.

결론적으로, Excel은 CSV 파일의 인코딩을 지정하는 메타데이터가 필요합니다. Microsoft는 이 목적으로 BOM(바이트 순서 마크) 헤더를 도입했습니다. 이 헤더는 다른 스프레드시트 소프트웨어에서는 무시될 수 있지만, Excel에는 매우 중요합니다. Excel을 포함한 다양한 소프트웨어와의 호환성을 보장하려면 CSV 생성 시 BOM 헤더를 포함하는 것이 필수적입니다.

팀에서 향후 버전에 이 해결책을 도입할 계획이 있는지 궁금합니다. 이를 통해 언어 지원 범위를 넓히고 버그 발생을 줄일 수 있을 것으로 기대됩니다.

이 문제에 관심을 가져 주셔서 감사합니다!

참고:
https://www.zhihu.com/question/21869078/answer/350728339

1개의 좋아요