WEB개발이야기/Node.js

문자코드와 인코딩 변환 방법

어쩌다보니여기까지~ 2018. 7. 10. 23:29
반응형

문자코드란?

문자코드란 컴퓨터가 사람이 알아볼 수 있는 문자로 표시하기 위해 각 문자에 할당한 고유번호를 말합니다.
초창기 문자를 나타내기 위한 아스키(ASCII)코드는 알파벳, 숫자, 특수 문자 등.. 각 문자에 해당하는 고유번호를 2진수 8비트로 지정하여 표시하였습니다.
2진수 8비트란 2진수인 01을 나타내는 스위치 8개로 고유번호를 할당한 것을 말합니다. 예를 들면 01101100A, 01101101B… 이런식으로 2의 8제곱( 256 )가지의 문자를 표시 할 수 있습니다.

하지만 아스키코드로 영문 알파벳, 숫자, 특수 문자 등 256가지 이내의 문자는 커버가 가능했지만 다양한 국가의 다양한 언어를 처리하기에는 256가지로는 부족하기 때문에 더 발전된 문자코드의 개발이 필요했습니다. 게다가 아시아권의 언어같은 경우는 8비트(1바이트)로는 부족해서 16비트(2바이트) 이상을 사용해야 처리가 가능했습니다.
그래서 각 나라의 언어에 맞게 CP37, ISO 8859, Windows-1250 등… 수많은 문자코드세트가 만들어 졌습니다. 한국의 경우는 EUC-KRCP949를 주로 사용했었고 현재도 많이 사용하고 있습니다.

하지만 문자코드에도 표준화가 필요했기 때문에 근래에는 대부분 유니코드(UTF-8, UTF-16)로 사용하는 추세입니다. 유니코드는 대부분 국가의 언어를 포함하고 있어 현재 대부분의 운영체제와 javascript, HTML, node.js등 다양한 프로그램 언어에서 기본적으로 사용되어 지고 있습니다.

Node.js에서의 문자코드

Node.js에서도 기본적으로 문자코드를 유니코드인 UTF-8을 사용합니다. 그래서 Node.js에서 사용할 프로그램을 작성할때는 꼭 UTF-8로 작성을 해야 합니다.
최근에 인기리에 사용되고 있는 모던 에디터인 Atom이나 서브라임텍스트, Visual studio Code등에서 새로 만든 문서는 기본적으로 UTF-8로 문서를 생성해 줍니다.

하지만 Node.js에서 fs모듈로 .txt 파일을 읽어들일 경우 대부분은 ANSI로 되어 있는 경우가 많은데 이럴경우 ANSIUTF-8로 변환을 해서 사용해야 합니다.

**ANSI : ** ANSI는 아스키코드(ASCII)를 말하며 **한글 Windows**에서는 EUC-KR의 확장버전인 **CP949**를 말합니다. 또한 `EUC-KR `은 아스키코드(ASCII)의 한글버전이라고 보면됩니다.

Node.js에서 문자코드 변환

Node.js에서 문자코드를 변경해 주는 모듈은 iconviconv-lite이 있습니다. iconv가 다양한 문자코드를 지원한다면 iconv-lite은 가볍고 간소화된 문자코드를 지원하고 있습니다. 그리고 jschardet 모듈은 현재 어떤 문자코드를 사용하고 있는지 모를때 알려주는 모듈 입니다.

  • iconv : 문자코드를 다른 문자코드로 변환
  • iconv-lite : 문자코드를 utf-8로 변환 또는 utf-8을 다른 문자로 변환
  • jschardet : 현재 문자코드가 어떤것인지 확인

설치

각 3개의 모듈은 아래와 같이 npm으로 설치가 가능 합니다.

# iconv 설치
$ npm install iconv

# iconv-lite 설치
$ npm install iconv-lite

# jschardet 설치
$ npm install jschardet

사용예제

iconv를 사용하여 문자코드 변경하기 입니다.

// iconv 사용 예제
var fs    = require('fs');
var Iconv = require('iconv').Iconv;

// euc-kr을 utf-8로 변환 설정
var encode = new Iconv('euc-kr', 'utf-8');

// euc-kr 파일 불러오기
var content = fs.readFileSync('test_euckr.txt');

// euc-kr을 UTF-8으로 변환
var content2 = encode.convert(content); 

// 버퍼를 문자열로 변환
var utf8Text = content2.toString('utf-8');

console.log(utf8Text);

// UTF-8으로 파일 저장
fs.writeFileSync('test_utf8.txt', utf8Text, 'utf-8');

iconv-lite를 사용하여 문자코드 변경하기 입니다.

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

// euc-kr 파일 불러오기
var content = fs.readFileSync('test_euckr.txt', "binary");

// euc-kr의 바이너리를 UTF-8로 변환
var utf8Text = iconv.decode(content, "euc-kr");

console.log(utf8Text);

// UTF-8으로 파일 저장
fs.writeFileSync('test2_utf8.txt', utf8Text, 'utf-8');

문자코드를 모를경우 jschardet 모듈로 확인하여 문자코드 변경하기 입니다.

var fs          = require('fs');
var Iconv       = require('iconv').Iconv;
var jschardet   = require('jschardet');

// 뮨자코드를 모르는 파일 불러오기
var content = fs.readFileSync('test_unknown.txt');

// 문자코드 확인
var content2 = jschardet.detect(content);
console.log(content2);

// Iconv 로 utf-8 로 변환하는 객체 생성
var iconv = new Iconv(content2.encoding, "utf-8");
var content3 = iconv.convert(content); // UTF-8 로 변환
var utf8Text = content3.toString('utf-8'); // 버퍼를 문자열로 변환 
console.log(utf8Text);

// UTF-8으로 파일 저장
fs.writeFileSync('test3_utf8.txt', utf8Text, 'utf-8');