본문 바로가기
Programming/Node.js

Node.js에서 euc-kr 인코딩 하기...

by 신규하 2019. 3. 7.

node에서 어쩌다 보니.. euc-kr을 인코딩 디코딩 할 일이 생겨서 해 보고 고생한 김에.. 메모를 남긴다.

우선 iconv-lite 패키지를 설치해야 한다.

$ npm install iconv-lite

아래는 euc-kr인 문서를 읽어서 utf-8로 바꾸고 euc-kr로 바꾸는 예제이다.

let iconv = require('iconv-lite');
let fs = require('fs');

// 처음 로딩시 enc-kr 파일
let content = fs.readFileSync('content-kr.txt');
console.log(content.toString());

let utf8Str = iconv.decode(content, 'euc-kr');
console.log(utf8Str);
// utf-8 text로 저장
fs.writeFileSync('content-utf-8.txt', utf8Str, { encoding: 'utf8' });

let euckrStr = iconv.encode(utf8Str, 'euc-kr');
console.log(euckrStr.toString());
// euc-kr text로 저장
fs.writeFileSync('content-euc-kr.txt', content, {encoding: 'binary'});

iconv-lite는 utf-8기준으로 인코딩/디코딩을 하는 라이브러리다.
그래서 euc-kr문서를 utf-8로 바꿀려고 하면..

decode => euc-kr

utf-8을 euc-kr로 바꿀려고 하면,

encode => euc-kr

-_-;; 모두 euc-kr을 써서 혼동 스러웠는데… utf-8을 기준으로 동작하는 거니..
어떻게 생각하면 편한거 같기도 하고..

그럼 끝…


추가

loverace님의 댓글을 보고 글을 수정하기 위해서 테스트를 진행해 봤습니다.
먼저 iconv-lite로 디코딩된 문자열이 utf-16으로 저장이 되나 해서 저장을 해 봤습니다.

fs.writeFileSync(‘파일명.txt’, utf8Str, { encoding: ‘ucs2 });

그런데 알 수 없는 문자열로 저장이 되었습니다.
그래서, 뭔가 잘 못 하나 싶어서.. 이것저것 확인을 진행 해 봤습니다.
그러다 문자열이 인코딩된 형태를 확인하는 detect-character-encoding 패키지를 발견 했습니다.
패키지를 설치하고

$ npm install detect-character-encoding

테스트 코드를 아래와 같이 작성했습니다.

const detectCharacterEncoding = require('detect-character-encoding');
const fs = require('fs');
const iconv = require('iconv-lite');

// 처음 로딩시 enc-kr 파일
const content = fs.readFileSync('content-kr.txt');
console.log('content', detectCharacterEncoding(content));

// euc-kr을 utf-8로 변환
const utf8 = iconv.decode(content, 'euc-kr');
console.log('euc-kr => utf8', detectCharacterEncoding(Buffer.from(utf8)));

// utf-8을 enc-kr로 변환
const euckr = iconv.encode(utf8, 'euc-kr');
console.log('utf8 => euckr', detectCharacterEncoding(Buffer.from(euckr)));

나온 결과 같은 아래와 같았습니다.

content { encoding: 'EUC-KR', confidence: 100 }
euc-kr => utf8 { encoding: 'UTF-8', confidence: 100 }
utf8 => euckr { encoding: 'EUC-KR', confidence: 100 }

아무래도.. iconv-lite로 디코딩 한 문자열은 자바스크립트 문자열이 아닌 utf-8로 나오나 봅니다.

loverace님 소중한 댓글 감사드립니다.
덕분에 iconv-lite를 좀 더 명확히 알 수 있었습니다.

추가로, detect-character-encoding 패키지는 리눅스 또는 MacOS에서만 실행이 가능 합니다. ^^*


댓글