알아보니 먼저 문자집합 (Character Set) 과 인코딩 (Encoding) 의 차이점을 알고 가야 할 것 같다.


 문자집합 (Character Set)은 정보를 표현하기 위한 글자나 기호들의 잡합을 정의한 것이다. 

음 쉽게 말해보면 번호를 매긴 문자들의 집합, 즉 키와 값이 1대1로 매핑 되어있는 것이다. 문자집합의 예로 아스키 코드, 유니코드 등이 있다.


 인코딩(Encoding)은 어떤 형태의 정보를 다른 형태로 바꾸는 것이다. 문자 집합도 일종의 인코딩이다.



 자 그럼 오늘의 토픽 주제인 유니코드와 utf-8,16 은 이렇게 생각해볼 수 있다.

유니코드는 전세계~ 언어를 모두 한 코드체계 안에 담기위해 만들어진 문자집합이고 utf-8,16은 그 유니코드를 사용하는 인코딩 방식이다!


탄생배경

 

 아주 간단히 말하면.. 초창기의 컴퓨터에는 표준 문자셋이 없었다. 그래서 표준 문자셋인 아스키코드가 나왔다. 하지만 이는 영어표기를 위함이었고 다른 나라의 언어를 사용하기엔 부족했다. 이를 해결하기위해 많은~ 문자셋이 개발 되어 왔고 전 세계 언어를 모두 표현하기 위해 유니코드라는 문자셋이 나오게 되었다. 


현재 유니코드에는 조합 가능한 모든 한글 음절이 수록되어 있다. (19*21*28 = 11,172)


위 그림은 유니코드 인코딩과 타 인코딩과의 관계이다. 

대표적으로  UTF-8 UTF-16 UTF-32 에 대해서 알아보자


 UTF-8 8비트 단위로 인코딩하는 방식이다. 


가변형 인코딩 방식으로 한글자를 1~4바이트로 표현한다. 

 설계원칙 으로 다음 세가지가 있다.

  • 1바이트로 표시된 문자의 최상위 비트는 항상 0이다.
  • 2바이트 이상으로 표시된 문자의 경우, 첫 바이트의 상위 비트들이 그 문자를 표시하는 데 필요한 바이트 수를 결정한다. 예를 들어서 2바이트는 110으로 시작하고, 3바이트는 1110으로 시작한다.
  • 첫 바이트가 아닌 나머지 바이트들은 상위 2비트가 항상 10이다.


변환 과정

 문자 "위" (U+C704) 는 다음과 같이 인코딩된다.

범위상 3바이트 즉 1110xxxx 10xxxxxx 10xxxxxx 형식으로 인코딩된다.

16진수 C704를 2진수로 바꾸면 1100 0111 0000 0100 이다.

이 수를 순서대로  x에 넣는다 11101100 10011100 10000100

이렇게 한글은 3바이트로 인코딩된다. (16진수로 EC 9C 84)


 UTF-8이 이런 성질을 가지도록 설계한 까닭은 어떤 경우에도 한 문자에 대한 바이트 표현이 다른 문자에 대한 바이트 표현의 일부가 되는 경우가 없도록 하기 위함이다.


이러한 설계 원칙 과 가변형 방식이라는 특징 때문에 여러 장점이 있다.

 바이트 경계를 순서대로 혹은 역순으로 찾기 쉽고 첫 바이트만 사용하여 해당 바이트 길이를 결정할 수 있다. 아스키코드 문자열과 호환성이 좋으며 (아스키인코딩은 utf-8의 부분집합, 하위 호환성 보장) 바이트 단위 문자열 검색 알고리즘을 그대로 사용 할 수 있다.


utf-16 과 비교하여 한중일 문자를 안쓰면 최소 2바이트를 사용하는 16보다 더 작은 크기로 표현할 수 있다. 

역으로 utf-16보다 한중일 문자만을 사용 할때는 더 많은 크기를 차지한다.


  




 UTF-16 16비트 단위로 인코딩하는 방식이다.

 최소 2바이트부터 최대 4바이트까지 인식한다. 기존 다국어 평면(BMP)는 2바이트로 그 이상의 문자는 4바이트로 인코딩이 된다 아스키와 호환이 어렵고 한중일 문자들이 2바이트로 표현되어서 한중일 언어를 인코딩 할 때 에는 utf-8 을 쓸 때 보다 크기가 작아 진다.



  UTF-32 모든 글자를 4바이트로 표현한다.

 모든 문자들을 4바이트로 동일하게 표현한다. 만약 이방식으로 전 시스템이 통일된다면 인코딩 변환이 필요없는 세상이 될 것이다. 하지만 저장공간의 낭비가 심하다는 단점이 있다. 



 저장기술이 더 발전 되어지고 기존 인코딩 방식을 고수하던 프로그램들이 바뀌면 언제가는 UTF-8과 같은 방식으로 통일이 되어지지 않을까? 생각이 든다.


참고 

http://norux.me/31 

https://d2.naver.com/helloworld/19187

http://nuli.navercorp.com/sharing/blog/post/1079940

http://www.allofsoftware.net/2015/06/9.html



'개념' 카테고리의 다른 글

[Windows10] 윈도우10 hosts파일 수정하기  (0) 2019.01.22
Jsp Php Asp ?  (1) 2018.07.27
웹서버와 웹 어플리케이션 서버 (WAS)  (1) 2018.07.06
TCP 3 Way-Handshake  (0) 2018.06.27
Base64  (0) 2018.06.26

+ Recent posts