티스토리 뷰

반응형

Node 를 통하여 CSV 파일을 만들고, Excel로 파일을 열었을 때 한글이 깨지는 현상이 있습니다. 코드로 수정하는 방법은 생각보다 간단합니다. 

const fs = require('fs')

const arr = [
   ['id', 'name', 'age', 'gender', 'createAt'],
   ['nyong', 'jypark', 30, 'M', new Date()],
   ['hyong', '박형', 11, 'M', new Date()],
   ['jyp', '박지요', 24, 'F', new Date()]
   ]
   
const data = arr.map((row) => row.join(',')).join('\n')
fs.writeFileSync('./result.csv', data)

이렇게 적용하게 되면 UTF-8 포맷이라 하더라도 한글이 깨지게 됩니다. 해결 방법은 문자열 데이터 앞에 \uFEFF를 붙여줍니다. 

const fs = require('fs')

const arr = [
   ['id', 'name', 'age', 'gender', 'createAt'],
   ['nyong', 'jypark', 30, 'M', new Date()],
   ['hyong', '박형', 11, 'M', new Date()],
   ['jyp', '박지요', 24, 'F', new Date()]
   ]
   
const data = arr.map((row) => row.join(',')).join('\n')
fs.writeFileSync('./result.csv', '\uFEFF' +  data)

BOM marker를 붙여주는 방법인데 BOM이 필요없는 곳에서는 해당 문자열이 방해가 될수도 있습니다. 


BOM(Byte Order Mark) : UTF-8 인코딩을 사용하면 각 문자가 1바이트 내에 표시될 수 있지만, UTF-16의 경우 2바이트가 필요합니다. 2바이트의 경우 바이트를 왼쪽에서부터 읽는지 오른쪽에서부터 읽는지에 따라 데이터가 달라지게 되는데, 이에 따라 완전히 다른 데이터가 생성됩니다. Big Endian (BE)은 왼쪽에서 오른쪽으로 데이터를 읽는 방법이고, Little Endian (LE) 은 오른쪽에서 왼쪽으로 데이터를 읽습니다. 

  • 왼쪽에서 오른쪽으로 : 01101010 00110101은 16 진수 표기법으로 6a35입니다.
  • 오른쪽에서 왼쪽으로 : 01101010 00110101은 16 진수 표기법으로 356a입니다.

일상 생활에서는 Big Endian을 주로 사용하는데 여기서 BE에 해당하는 문자열이 feff이고 LE에 해당하는 문자열이 fffe입니다. \uFEFF를 붙이는 이유는 명시적으로 표현하기 위해 붙이는 문자열이라고 합니다. 

참고: https://www.w3.org/International/questions/qa-byte-order-mark

 

The byte-order mark (BOM) in HTML

Intended audience: XHTML/HTML coders (using editors or scripting), script developers (PHP, JSP, etc.), CSS coders, Web project managers, and anyone who needs to better understand what the BOM is, and how it affects HTML. What is the byte-order mark, and wh

www.w3.org

 

반응형

'Server' 카테고리의 다른 글

API Throttling 에 대해서  (0) 2021.06.17
PM2 를 활용한 서비스 운영하기  (0) 2021.06.15
Socket.io 사용하여 채팅 구현하기  (0) 2021.06.15
Redis와 Express Session 함께 사용하기  (0) 2021.06.15
Node js Redis 자료구조  (0) 2021.06.15
Node에 Redis 연결하기  (0) 2021.06.15
댓글
공지사항