λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’‘ issue

JavaScript 둜 μƒμ„±ν•œ csv νŒŒμΌμ—μ„œ ν•œκΈ€μ΄ 깨진닀면?

by HandHand 2023. 3. 18.

 

πŸ“Œ JavaScript 둜 csv 파일 μƒμ„±ν•΄μ„œ λ‹€μš΄λ‘œλ“œλ°›κΈ°

이전에 csv 포맷을 λ‹€λ£° 일이 μƒκ²¨μ„œ Blob 객체λ₯Ό μƒμ„±ν•΄μ„œ νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œ 받도둝 μ½”λ“œλ₯Ό κ΅¬ν˜„ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€.

 

const download = function (data) {
    const blob = new Blob([data], { type: 'text/csv' });
    const url = URL.createObjectURL(blob)

    const a = document.createElement('a')
    a.setAttribute('href', url)
    a.setAttribute('download', 'νŒŒμΌμ΄λ¦„.csv');
    a.click()
}

 

μ½”λ“œλŠ” κ°„λ‹¨ν•©λ‹ˆλ‹€.

λ¦¬μ†ŒμŠ€νƒ€μž…μ΄ λͺ…μ‹œλœ Blob 객체λ₯Ό μƒμ„±ν•œ λ’€ 이λ₯Ό κ°€λ¦¬ν‚€λŠ” Object URL 을 μƒμ„±ν•˜κ³ ,

μ‹€μ œ DOM Tree 에 λ Œλ”λ§ν•˜μ§€μ•ŠλŠ” a νƒœκ·Έμ— 이 url 을 ν• λ‹Ήν•˜μ—¬

클릭 이벀트λ₯Ό 직접 λ°œμƒμ‹œμΌœ λ‹€μš΄λ‘œλ“œκ°€ 이루어지도둝 ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

 

πŸ“Œ ν•œκΈ€ 인코딩 깨짐 ν˜„μƒ ν•΄κ²°ν•˜κΈ°

λŒ€λΆ€λΆ„μ˜ λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œλŠ” λ¬Έμ œκ°€ μ—†μ—ˆμ§€λ§Œ,

νŠΉμ • ν™˜κ²½λ“€μ—μ„œ (μ‚Όμ„± λΈŒλΌμš°μ € or μœˆλ„μš° ν™˜κ²½ λ“±) ν•œκΈ€μ΄ κΉ¨μ Έμ„œ μ €μž₯λ˜λŠ” μ΄μŠˆκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

 

원인을 μ°Ύμ•„λ³΄λ‹ˆ λ°”μ΄νŠΈ μˆœμ„œ ν‘œμ‹(Byte Order Mark) μ΄λΌλŠ” 것을 μ•Œκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

일반적으둜 UTF νŒŒμΌμ€ 이 BOM 을 λͺ…μ‹œν•΄μ„œ λ°”μ΄νŠΈλ₯Ό μ½λŠ” μˆœμ„œλ₯Ό λͺ…μ‹œν•  수 μžˆλ‹€κ³  ν•©λ‹ˆλ‹€. (little-endian, big-endian)

 

ν•œκΈ€μ„ ν¬ν•¨ν•˜λŠ” μœ λ‹ˆμ½”λ“œ λ¬ΈμžλŠ” λŒ€λΆ€λΆ„ UTF-8 둜 μΈμ½”λ”©λ˜κΈ° λ•Œλ¬Έμ—

Blob 객체λ₯Ό 생성할 λ•Œ μ‚¬μš©ν•˜λŠ” 데이터 맨 μ•žμ— \ufeff λ₯Ό μΆ”κ°€ν•΄μ„œ

μš°λ¦¬κ°€ 생성할 csv λ°μ΄ν„°μ˜ 인코딩 방식을 λͺ…μ‹œν•΄μ€λ‹ˆλ‹€.

 

const blob = new Blob(['\ufeff' + data], { type: 'text/csv' });

 

πŸ“Œ 참고자료

How to create and download CSV file in JavaScript ? - GeeksforGeeks

λ°”μ΄νŠΈ μˆœμ„œ ν‘œμ‹ - μœ„ν‚€λ°±κ³Ό, 우리 λͺ¨λ‘μ˜ 백과사전

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ csv 파일 μƒμ„±μ‹œ ν•œκΈ€ 깨짐 문제 ν•΄κ²°

λ°˜μ‘ν˜•

πŸ’¬ λŒ“κΈ€