문자코드와 인코딩 변환 방법
문자코드란?
문자코드란 컴퓨터가 사람이 알아볼 수 있는 문자로 표시하기 위해 각 문자에 할당한 고유번호를 말합니다.
초창기 문자를 나타내기 위한 아스키(ASCII)코드는 알파벳, 숫자, 특수 문자 등.. 각 문자에 해당하는 고유번호를 2진수 8비트로 지정하여 표시하였습니다.
2진수 8비트란 2진수인 0과 1을 나타내는 스위치 8개로 고유번호를 할당한 것을 말합니다. 예를 들면 01101100은 A, 01101101은 B… 이런식으로 2의 8제곱( 256 )가지의 문자를 표시 할 수 있습니다.
하지만 아스키코드로 영문 알파벳, 숫자, 특수 문자 등 256가지 이내의 문자는 커버가 가능했지만 다양한 국가의 다양한 언어를 처리하기에는 256가지로는 부족하기 때문에 더 발전된 문자코드의 개발이 필요했습니다. 게다가 아시아권의 언어같은 경우는 8비트(1바이트)로는 부족해서 16비트(2바이트) 이상을 사용해야 처리가 가능했습니다.
그래서 각 나라의 언어에 맞게 CP37, ISO 8859, Windows-1250 등… 수많은 문자코드세트가 만들어 졌습니다. 한국의 경우는 EUC-KR과 CP949를 주로 사용했었고 현재도 많이 사용하고 있습니다.
하지만 문자코드에도 표준화가 필요했기 때문에 근래에는 대부분 유니코드(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로 되어 있는 경우가 많은데 이럴경우 ANSI를 UTF-8로 변환을 해서 사용해야 합니다.
Node.js에서 문자코드 변환
Node.js에서 문자코드를 변경해 주는 모듈은 iconv와 iconv-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');