본문 바로가기
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에서만 실행이 가능 합니다. ^^*


댓글6

  • 2019.05.13 01:55

    비밀댓글입니다
    답글

  • lisyoen 2019.06.06 16:57

    예제코드가 잘못된 것 같은데요.
    kr 변수가 euc-kr 을 말하는거라면 iconv.encode 를 사용해야 하는거죠?
    그런데 writeFileSync 에서는 encoding: 'utf8' 로 기록하고 있네요.
    전반적으로 뭔가 뒤섞인 예제 같습니다.
    아래 설명과 달라서 한참 테스트 해봤네요.
    답글

    • 신규하 2019.06.12 02:06 신고

      예제코드를 다시 확인 해 봤는데..
      별 이상은 없었습니다.
      제가 처음에 읽은 파일이 euc-kr로 인코딩 된 텍스트 인데 그걸 설명을 안 해서 이해가 잘 안 되는게 아닌가 싶네요..
      저두 처음에 이게 뭔가 싶을 정도로 혼란 스러워서 정리한 내용 입니다.
      이해가 좀 쉽도록 코드에 주석을 추가 해 뒀습니다.

  • 코린이 2019.09.04 08:45

    포스팅이 도움 되었습니다
    감사합다
    답글

  • loverace 2019.12.17 22:47

    포스팅 잘 읽어 보았습니다.

    읽다보니 내용에 약간의 오류가 있네요.
    iconv-lite 라이브러리는 디코딩을 하게 되면 결과물로 자바스크립트 문자열을 돌려줍니다.
    예, iconv.decode(str, 'euckr' ) => euckr로 인코딩 되어 있는 문자열을 자바스크립트 문자열로 디코딩
    iconv.decode(str, 'utf8' ) => utf8로 인코딩 되어 있는 문자열을 자바스크립트 문자열로 디코딩

    반대로 인코딩시에는 자바스크립트 문자열을 지정한 인코딩방식으로 변환합니다.
    예, iconv.encode(str, 'euckr' ) => 자바스크립트 문자열을 euckr로 인코딩.
    iconv.encode(str, 'utf8' ) => 자바스크립트 문자열을 utf8로 인코딩.

    참고로, 자바스크립트 엔진은 모든 문자열을 utf-16으로 처리합니다.
    utf-16은 유니코드 bmp(기본다국어평면)의 문자코드와 일대일로 대응되며 (기본 16bit),
    서로게이트 코드를 이용해서,
    bmp외의 나머지 16개 평면의 문자코드를 16bit 코드 2개(32bit)로 표현합니다.



    답글

    • 신규하 2019.12.18 16:46 신고

      댓글 감사합니다.
      자바스크립트에서 문자열 인코딩 할 일이 있어서 메모를 남겼던 건데..
      자바스크립트 문자열이라는 생각은 미쳐 하지 못 했네요..
      감사합니다.
      큰 도움이 되었습니다.