알아보니 먼저 문자집합 (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과 같은 방식으로 통일이 되어지지 않을까? 생각이 든다.
참고
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 |