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에서만 실행이 가능 합니다. ^^*
댓글