알아보니 먼저 문자집합 (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
유니코드와 utf-8 utf-16  (3) 2018.06.26
Base64  (0) 2018.06.26
  1. 강수길 2020.05.30 12:27

    안녕하세요! 글 너무 잘 봤습니다.
    UTF8에서 어떤 한 글자의 인코딩값이 다른 글자의 인코딩의 서브셋이 "안"되도록 하기 위해 UTF8처럼 1110 110 10을 붙여 인코딩한다고 하셨는데.. 서브셋이 되지 않는다면 어떤 장점이 있을까요? 생각을 해봐도 답이 나오지 않아 질문드립니다.

    • 졸린눈 2020.05.30 16:22 신고

      우선 다른 문자의것으로 혼동되는 것을 막기때문에 어떤 긴 텍스트에서 원하는 부분 텍스트를 찾을때 보다 쉬운 알고리즘을 적용할 수 있고 (만약 하나의 문자가 다른문자의 서브셋으로도 사용된다면 해당 문자인지 서브셋인지 확인이 필요할 것 같습니다)
      또 하나 이상의 바이트들이 손실되었을 때도 다음의 정상 문자를 찾아내어 피해를 최소화 할 수 있다는 장점이 있다고 합니다!.
      http://z3moon.com/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C
      https://ko.wikipedia.org/wiki/UTF-8
      를 참조했습니다.

  2. D 2020.08.20 18:26

    Ansi C 정도의 프로그래밍을 하다가, 가끔 윈도우용 프로그램을 짤 일이 생깁니다.
    wstring, string, unicode, utf-8 등에 대해서 좀 더 정확하게 이해하려, 여러웹사이트를 돌아다니고 있습니다.
    utf-8 에 대해 잘 설명해주셔서, 도움이 많이 되었습니다. 감사합니다.

+ Recent posts