< 인프런의 '개발자를 위한 컴퓨터 공학 : 혼자 공부하는 컴퓨터 구조 + 운영체제' 를 학습하며 정리합니다. >
앞서, 컴퓨터는 0과 1로만 이해할 수 있다는 사실과 함께 사람이 쓰는 숫자 체계를 컴퓨터가 처리하는 방법에 대해서 살펴보았다. 그렇다면, 이번에는 컴퓨터가 0과 1로 문자를 처리하는 방법에 대해서 알아보자.
문자 집합과 인코딩,디코딩
(1) 문자 집합(character set) - 컴퓨터가 이해할 수 있는 문자의 모음
(2) 인코딩(encoding) - 코드화하는 과정 / 문자를 0과 1로 이루어진 문자 코드로 변환하는 과정
(3) 디코딩(decoding) - 코드를 해석하는 과정 / 0과 1로 표현된 문자 코드에서 문자로 변환하는 과정 따라서 2비트면 4가지의 정보, 3비트면 8가지의 정보 표현을 할 수 있다.
한편, 대표적인 문자 집합 및 인코딩 방법에는 ' 아스키 코드 '가 있다.
아스키 코드 - 초장기 문자 집합 중 하나 - 알파벳, 아라비아 숫자, 일부 특수 문자 및 제어 문자 - 7비트로 하나의 문자 표현 > 8비트 중 1비트는 오류 검출을 위해서 사용되는 패리티 비트(parity bit)
따라서 아스키 코드로 표현할 수 있는 총 문자의 갯수는 2^7 개이다.( = 128개)
이와 같은 방식은 간단한 인코딩 방식으로 문자를 표현한다는 장점을 지니고 있다.
그러나, 한글을 포함한 중국, 일본 등등의 다른 언어 문자나 다양한 특수 문자 표현이 불가하다는 단점을 지녔다.그리하여 기존 7비트에서 8비트 확장 아스키 ( extended ASCII )가 등장하여 표현할 수 있는 문자의 수를 늘렸다.( 여전히 부족 )
이처럼 기존의 아스키 코드만으로는 다른 언어들을 모두 커버할 수 있는 문자 집합과 인코딩으로는 부적합하여, 언어별 인코딩 방식이 도입이 추진되었다.
ex)한글 인코딩 : 완성형 vs 조합형 인코딩
영어와 달리 한글이 가진 특징이 있다. 영어는 각 알파벳을 그대로 나열하는 방식으로 하나의 단어를 이룬다.(apple) 그러나, 한글은 각 자음과 모음의 조합과 초성,중성,종성의 조합으로 글자 및 단어가 만들어진다. (사과)
이에 인코딩 방식에는 완성형과 조합형이 있는데, 완성형은 '강'에 하나의 코드를 부여하고 '민'에 하나의 코드를 부여하는 방식으로 모든 조합에 고유한 코드를 부여하는 것이다. 반면 조합형은 'ㄱ', 'ㅏ', 'ㅇ' 각각에 코드를 부여하고 레고를 조립하듯 언어를 완성하는 방식이다.
< 실제 한글의 인코딩 방식 > @ EUC-KR - KS X 1001 KS X 1003 문자집합 기반의 한글 인코딩 방식 - 완성형 인코딩 - 글자 하나에 2바이트 크기의 코드 부여 ( 2바이트 == 16비트 == 4자리 십육진수로 표현) - 2300여개의 한글 표현 가능 - 여전히 모든 한글을 표현하기에는 부족한 수 - 쀏, 뙠, 휔 같은 한글은 표현 불가능
더군다나 이렇게 언어별 인코딩을 국가마다 하게 되면, 다국어를 지원하는 프로그램을 개발할 경우에는 언어별 인코딩 방식을 모두 이해해야 한다...
이러한 번거로움과 고민에 모든 언어, 특수문자까지 통일된 문자 집합을 사용하는 것에 대한 갈증을 자연스럽게 느끼게 되었고, 통일된 문자 집합 & 인코딩 방식을 만들었다.
유니코드 문자 집합과 utf-8
(1) 유니코드
- 통일된 문자 집합
- 한글, 영어, 화살표와 같은 특수 문자, 심지어 이모티콘까지
- 현대 문자 표현에 있어 매우 중요한 위치
(2) 유니코드의 인코딩 방식
=> utf-8, utf-16, utf-32 ...
많은 인코딩 방식 중 가장 대중적인 utf-8 인코딩 방식에 대해서 알아보겠다.
UTF-8 인코딩 - UTF(Unicode Transformation Format) == 유니코드 인코딩 방법 - 가변 길이 인코딩 : 인코딩 결과가 1바이트 ~ 4바이트 ( 유니코드에 부여된 값에 따라 다르다.) - 인코딩 결과가 몇 바이트가 될지는 유니코드에 부여된 값에 따라 다름
따라서 만약 개발 도중 " 글자가 깨진다면??? "
우리는 < (1) 문자집합에 속하는 지 / (2) 인코딩 방식에 문제가 있는 지 >를 파악할 수 있다.
댓글