인코딩과 디코딩.
말은 많이 들어보고 알게 모르게 써왔던 것 같지만 정확한 개념은 모르고 있는 듯하다. 일반적으로 음악파일이나 동영상 파일을 변환할 때 많이 접하는 용어이기도 하고 웹에서 자주 접하기도 한다.
이번 포스팅을 통해 확실하게 정리해보자.
우선 용어의 의미에 대해 알아보자.
인코딩(Encoding) / 디코딩(Decoding)
먼저 인코딩을 영어사전에 검색해 보면 '부호화하다'라는 뜻이 나온다. 분야에 따라 뜻이 조금씩 다른데 컴퓨터분야에 가까운 의미를 찾아보면 '입력 데이터를 컴퓨터 속에서 사용하는 코드로 변환하는 것' 이라는 말이 나온다. 사전적 의미를 다음과 같이 정리할 수 있을 것 같다. (찾아본 결과 위키피디아에 구체적인 내용이 많아서 참고하였다)
- 인코딩
: 문자나 기호들의 집합을 컴퓨터에 저장하거나 통신에 사용할 목적으로 부호화하는 방법이다. 문자 인코딩(Character Encoding) 이라고도 한다. 복호화(디코딩 : Decoding)를 하면 본래의 문자나 기호를 나타내는 문자코드(Character Code)가 된다.
부호화를 수행하는 장치나 회로, 소프트웨어 및 알고리즘을 부호기 또는 인코더(Encoder) 라고 한다.
- 디코딩
: 인코딩의 반대 개념이라고 보면 된다. 복호화라고도 하는데 부호화(Encoding)된 정보를 부호화되기 전으로 되돌리는 처리 방식을 말한다. 인코더와 마찬가지로 복호화를 수행하는 것들을 복호기 또는 디코더(Decoder) 라고 한다.
* 문자 인코딩(Character Encoding)의 구성
크게 문자 집합 / 문자 인코딩 형태 / 문자 인코딩 구조 의 3가지로 구성된다.
▶ 문자집합 (캐릭터 셋 : Character Set)
정보를 표현하기 위한 글자들의 집합이다. 많이 들어본 집합으로 ASCII코드와 유니코드가 있다.
(ASCII코드는 더 이상의 문자가 추가될 수 없는 고정된 집합이고, 유니코드는 계속 문자가 추가될 수 있다)
▶ 문자 인코딩 형태 (Character Encoding Form, CEF)
특정한 문자 집합 안의 문자들을 컴퓨터 내에서 사용할 목적으로 일정한 범위 안의 정수로 변환하는 방법이다.
예를 들면 유니코드를 8비트 숫자의 집합으로 나타내는 UTF-8이나 ,16비트로 나타내는 UTF-16 등이 있고 대부분의 일반적인 문자 인코딩들이 포함된다.
▶ 문자 인코딩 구조 (Character Encoding Scheme, CES)
문자 인코딩 형태로 변환된 코드값을 옥텟 기반의 시스템에서 활용하기 위해 옥텟들로 변환하는 방법이다. ISO 2022와 같은 복합 인코딩이나, SCSU와 같은 압축 방법이 해당된다.
알아보니 내용도 많고 종류도 많고 꽤나 복잡하다. 알아본 내용을 토대로 정리해 보면 인코딩과 디코딩을 하는 이유는 다음과 같다.
인코딩과 디코딩을 하는 이유
국가별로 언어가 다르듯이 각 언어마다 하나의 규격으로 표준화시켜 국가별 또는 개인의 요구에 따라 사용할 수 있도록 문자 집합을 만들고, 이러한 문자 집합을 가지고 부호화 하여 사용하기 위한 것이 인코딩과 디코딩을 하는 이유라고 볼 수 있다.
그렇다면 인코딩과 디코딩을 하기 위해 사용하는 문자 인코딩들의 종류에 대해 알아보자. 아래의 스샷을 보자.
엄청 많다... 여기 나와있는 것들은 일부이고 더 많은 집합들이 있다.
여기서 우리는 상단의 ASCII코드와 하단의 유니코드에 대해 알아볼 필요가 있다.
ASCII코드를 통해 문자집합이 시작되어 유니코드로 통일되어진다고 볼 수 있기 때문이다.
아스키코드 (ASCII, American Standard Code for Information Interchange)
: 영문 알파벳을 사용하는 대표적인 문자 인코딩이다. 국제 표준 기구에 의해 개발되었으며, 1967년에 미국 국립 표준 연구소에서 표준으로 제정되었다.
아스키는 7비트 인코딩이고, 33개의 출력 불가능한 제어문자, 공백을 비롯한 95개의 출력 가능한 문자들로 이루어진다.
(설명을 보니 제어문자들은 거의 명령어의 의미를 담고 있다)
95개의 출력 가능한 문자는 52개의 영문 알파벳 대소문자, 10개의 숫자, 32개의 특수문자, 마지막으로 하나의 공백 문자로 구성된다.
널리 사용되면서 아스키 기반의 다양한 확장 인코딩들이 등장했다. (모두 묶어서 아스키라고도 부르기도 한다)
대표적인 아스키 문자 인코딩으로는 ISO/IEC 646 / IBM 코드 페이지(0을 추가하여 8비트 인코딩으로 구성) / ISO 8859 가 있다.
유니코드(Unicode)
: 유니코드 협회(Unicode Consortium) 에서 제정하였고, 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준이다. 아스키코드를 16비트로 확장하여 전 세계의 모든 문자를 표현한다.
유니코드의 목적은 현존하는 문자 인코딩 방법을 모두 유니코드로 교체하는 것이다.
(기존의 인코딩들은 규모나 범위 면에서 한정되어 있고 서로 호환되지 않는 문제점이 있기 때문)
문자 집합 / 문자 인코딩 / 문자 정보 데이터베이스 / 문자를 다루는 알고리즘 등을 포함한다.
XML, 자바 및 최신 운영 체제 등에서도 지원하고 있다.
JSP를 공부하는 분들이라면 다음 코드들의 의미가 좀 더 명확하게 다가올 것이다.
▶ page 디렉티브의 'charset' / 'pageEncoding' 속성
▶ request 기본 객체의 setCharacterEncoding() / getCharacterEncoding()
▶ java.net 패키지의 URLEncoder / URLDecoder 클래스
추가로 우리나라 웹페이지에서 많이 쓰이는 EUC-KR 과 UTF-8 문자 집합에 대해 알아보자.
* EUC-KR
8비트 문자 인코딩의 대표적인 한글 완성형 인코딩이다. (보통 완성형이라 불린다) KS X 1001 과 KS X 1003 을 사용하여 만들어졌다.
(128보다 작은 바이트에 KS X 1003 을 사용하고, 128보다 큰 바이트에 KS X 1001 을 사용한다. / 둘 다 한국산업규격으로 지정된 한국어 문자 집합)
한글 한 글자를 2바이트로 처리하며, 2350개의 한글문자, 한자와 영문을 표현할 수 있다.
문서 작성시 한정된 범위내의 문자만 사용할 경우에 사용한다.
* UTF-8
유니코드를 위한 가변길이 문자 인코딩 방식 중 하나이다. 전 세계 모든 문자를 표현할 수 있다. 한 문자를 표현하기 위해 1바이트에서 4바이트까지 사용한다. 캐릭터 셋을 UTF-8로 작성한다면 HTML 파일 타입도 UTF-8을 사용하여 저장해야 한다.
한글의 한 글자를 3바이트로 처리하지만, 공백이나 영문, 한자는 1바이트로 처리하는 융통성을 보여준다.
두 문자 집합을 비교해봤을 때 다국적의 웹 페이지를 만들려면 UTF-8을 사용하는 것이 좋다.
기존의 인코딩과 비교했을 때 UTF-8이 가지는 장단점은 다음과 같다.
UTF-8의 장점
▶ 모든 유니코드 문자 표현 가능
▶ 바이트 경계를 순서대로, 혹은 역순으로 찾기 쉽다
▶ 각 문자의 바이트 표현이 독립적이다. (다른 문자에 영향을 주지 않는다) 이것은 아스키 문자가 아닌 값들에 투명한 파일 시스템이나 다른 소프트웨어와 호환성을 가진다는 것을 의미한다.
▶ 첫 바이트만 사용하여 해당 바이트 표현의 길이를 결정할 수 있다. (문자열을 매우 쉽게 얻을 수 있다)
▶ 인코딩에 간단한 비트연산만 사용되어 효과적이다. (UTF-8은 곱셉이나 나눗셈 같은 느린 연산을 사용하지 않는다)
UTF-8의 단점
▶ 대부분의 UTF-8 문자열들은 기존 인코딩의 문자열 보다 크기가 크다.
여기까지 정리하도록 하겠다.
인코딩에 대해 알아보니 알아본 내용 외에도 상당히 많은 내용이 있다는 것을 알 수 있었다. 그만큼 중요한 부분이기도 하다.
계속 공부를 하면서 관련된 내용이 있으면 덧붙여 포스팅 하도록 하겠다.