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에서만 실행이 가능 합니다. ^^*
비밀댓글입니다
답글
예제코드가 잘못된 것 같은데요.
kr 변수가 euc-kr 을 말하는거라면 iconv.encode 를 사용해야 하는거죠?
그런데 writeFileSync 에서는 encoding: 'utf8' 로 기록하고 있네요.
전반적으로 뭔가 뒤섞인 예제 같습니다.
아래 설명과 달라서 한참 테스트 해봤네요.
답글
예제코드를 다시 확인 해 봤는데..
별 이상은 없었습니다.
제가 처음에 읽은 파일이 euc-kr로 인코딩 된 텍스트 인데 그걸 설명을 안 해서 이해가 잘 안 되는게 아닌가 싶네요..
저두 처음에 이게 뭔가 싶을 정도로 혼란 스러워서 정리한 내용 입니다.
이해가 좀 쉽도록 코드에 주석을 추가 해 뒀습니다.
포스팅이 도움 되었습니다
감사합다
답글
포스팅 잘 읽어 보았습니다.
읽다보니 내용에 약간의 오류가 있네요.
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)로 표현합니다.
답글
댓글 감사합니다.
자바스크립트에서 문자열 인코딩 할 일이 있어서 메모를 남겼던 건데..
자바스크립트 문자열이라는 생각은 미쳐 하지 못 했네요..
감사합니다.
큰 도움이 되었습니다.
포스팅이 좋은 참고가 되었습니다. 감사합니다
답글