인코딩과 디코딩 (Encoding & Decoding)
컴퓨터는 문자를 인식할 수 없기 때문에 숫자로 변환되어 저장됩니다. 변환해주기 위해서는 기준이 있어야하는데 이것을 문자 코드라고 하며 대표적으로 ASCII코드 또는 유니코드가 있습니다.
이렇게 문자 코드를 기준으로 문자를 코드로 변환하는 것을 문자 인코딩(encoding) 이라하고 코드를 문자로 변환하는 것을 문자 디코딩(decoding) 이라고 합니다.
인코딩/디코딩은 정보의 형태나 형식을 변환하는 처리에 대해 표준화하고 보안, 처리 속도 향상, 저장 공간 절약 등의 목적으로 사용합니다.
아스키(ASCII)코드
아스키(ASCII)는 미국정보교환표준부호(American Standard Code for Information Interchange)의 약어이며 미국 ANSI에서 표준화한 정보교환용 7비트 부호체계입니다.
000(0X00)부터 127(0X7F)까지 총 128개의 문자 집합을 제공하며, 처음 32개는 인쇄와 전송 제어용으로 사용되는 제어 문자(Control Characters)이고 이를 제외한 33번째 이후의 문자들에 대해 숫자 및 영문 대소문자가 배치되어 사용됩니다. (127번째 마지막 문자 DEL은 제외)
일반적으로 데이터는 byte 단위로 다뤄지는데 ASCII는 1바이트를 구성하는 8비트 중에서 7비트만 사용하고 나머지 1비트는 통신 에러 검출을 위해 사용합니다. 이 비트를 Parity Bit 라고 하는데 현재는 더 이상 사용되지 않습니다.
ASCII코드는 매우 단순하고 간단하여 어느 시스템에서도 적용 가능하다는 장점이 있으나 2바이트 이상의 코드를 표현할 수 없다는 단점이 있습니다.
※ ANSI : American National Standards Institute, 미국 국립 표준 협회
다음은 ASCII 코드표입니다.
확장 아스키(ASCII)와 한글
앞서 설명했듯이 ASCII는 1바이트를 구성하는 8비트 중 7비트만 사용하는데 나머지 1비트를 활용해서 추가로 문자를 정의한 것이 확장 ASCII 입니다. 확장 ASCII에 추가된 128개의 문자는 여러 국가와 기업에서 필요에 따라 서로 다르게 정의하여 사용합니다.
확장 ASCII에는 다음과 같은 대표적인 문자 집합들이 있습니다.
ISO 8859-1 : 국제표준화기구에서 정의한 확장 ASCII 이며 서유럽에서 일반적으로 사용하는 문자들을 포함. 'ISO Latin 1' 이라고도 함.
CP949 : 마이크로소프트에서 정의한 한글 문자 집합. EUC-KR에서 지원되는 한글 2350자 외에 나머지 8822자가 추가되었으며 Win95 한글판에 탑재되어 배포됨.
※ 코드페이지(Code Page)
IBM에서 PC를 사용하는 지역이나 국가에 따라 여러 버전의 확장 ASCII가 필요한 경우에 대해 코드페이지라 명명하고 'CP xxx'와 같은 형식으로 이름을 붙이도록한 방식
유니코드
확장 ASCII와 같이 영어 이외의 언어를 사용하기 위해 국가별 인코딩 표준이 만들어져 사용됐지만, 인터넷의 발달로 인한 다른 지역간의 다른 언어를 사용한 문서 교환이 활발해지면서 문제점이 나타나게 되었습니다. 이러한 문제를 해결하기 위해 모든 문자 체계를 하나의 문자 집합으로 만든 것이 유니코드입니다.
유니코드는 먼저 포함시키고자 하는 문자 집합을 정의하였는데 이것을 문자 셋 또는 캐릭터 셋(character set)이라고 합니다. 또한 이것을 UTF(Unicode Transformation Format) 이라고 하며 여기에 번호를 붙인 것이 유니코드 인코딩입니다.
유니코드 인코딩에는 UTF-8, UTF-16, UTF-32 등이 있는데 대표적으로 쓰이는 UTF-8과 UTF-16에 대해서 알아보겠습니다.
UTF-8 : 하나의 문자를 1~4바이트의 가변길이로 표현. 1바이트 영역은 ASCII코드와 하위 호환되며 ASCII코드의 128개 문자 집합은 UTF-8과 동일하게 호환됨. 현재 인터넷에서 가장 많이 쓰이는 인코딩이며 뛰어난 크로스플랫폼 호환성도 갖고 있음.
UTF-16 : 모든 문자를 2바이트의 고정크기로 표현하고 UTF-8과 마찬가지로 ACII코드의 128개 문자 집합에 대해 호환성을 가짐. 바이트 순서가 정해지지 않아 리틀/빅 엔디안 문제가 발생하기 때문에 인터넷 상에서의 사용을 권고하지 않음.
Java와 .NET Framework의 기본 인코딩.
UTF-8과 UTF-16의 특징을 비교해봤을 때, UTF-16의 경우는 다루기 쉽지만 1바이트로 표현할 수 있는 영문, 숫자가 2바이트로 표현되어 문서의 크기가 커진다는 단점이 있습니다. 반면에 UTF-8의 경우는 가변 길이라 다루기 어렵지만 영문, 숫자가 1바이트로 표현되고 한글이 3바이트로 표현되어 문서의 크기를 작게 다룰 수 있다는 장점이 있습니다.
인터넷에서는 UTF-8 인코딩을 많이 사용합니다. 인터넷에서는 전송속도가 중요한 기준이 되는데 이에 맞춰서 문서의 크기를 작게 변환해주고, 크로스플랫폼 호환성을 통해 엔디안에 상관없이 사용 가능하다는 점이 많이 사용되는 이유입니다.
이상으로 인코딩과 디코딩에 대해 알아봤습니다.
※ 참고 문헌
남궁성, 『Java의 정석 3rd Edition』, 도우출판(2016), p59. chapter 02 변수 variable
위키백과, 아스키코드, https://ko.wikipedia.org/wiki/ASCII
위키백과, 유니코드, https://ko.wikipedia.org/wiki/유니코드
위키백과, iso 8859-1, https://ko.wikipedia.org/wiki/ISO/IEC_8859-1
위키백과, cp949, https://namu.wiki/w/CP949