문자코드와 인코딩 변환 방법
문자코드란?
문자코드란 컴퓨터가 사람이 알아볼 수 있는 문자로 표시하기 위해 각 문자에 할당한 고유번호를 말합니다.
초창기 문자를 나타내기 위한 아스키(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');