유니코드는 어떻게 생겨났을까?
옛날옛적, 컴퓨터가 처음 세상에 나왔을 때, 영어와 몇가지 특수문자만 활용이 되었고, 이런 적은 문자를 컴퓨터에 저장하기 위해서 1byte(8bit)면 충분했다.(0~255) - ASCII 문자
시간이 흘러, 다른 국가의 언어들이 활용되었고, 해당 국가의 사람은 자신의 언어를 표시하고 싶어졌다. 그래서 1byte안에 임의대로 영어 대신에 자신의 나라 문자를 할당하여 사용하게 되었다. - 문자열셋의 춘추전국시대...
그러다, 인터넷이 발전되며 다른 나라 사람의 홈페이지를 들어갔더니 글자가 와장창 깨지는 상황이 발생한다. 호환이 되지 않는 것이다. 그리하여, 국제적으로 전세계 모든 언어를 표시할 수 있는 표준코드를 만들기로 하였다.
이것이 바로 유니코드(unicode)이다.
참고로, 한글 ‘가’
는 유니코드로 ‘U+AC00’
이다. 왜냐고요? 약속입니다.
유니코드를 통해서 문자를 나타내는 코드는 정의되었다. 즉, 각 문자마다 인덱스가 정해졌다. 그럼 이 코드를 컴퓨터에 어떤 방식으로 저장할 것인가?
❓ 이미 문자를 숫자로 나타낸 유니코드 표가 있는데, 왜 이 숫자를 컴퓨터에 저장할 때 또 변환해야할까?
❗ 자리 수를 얼마나 할당하느냐에 따라 유니코드를 7bit씩 혹은, 1byte씩 차지하도록 할 수도 있다. 그런데 이렇게 하면 표현 가능한 갯수가 한계가 있으므로, 앞에 0을 더채워서 4byte씩 통일해서 할당할 수도 있다. 근데 4byte로 통일하면, 문서의 크기가 커진다... 어떻게 해야 호환도 잘되고, 용량도 적게 만들 수 있을까? 유니코드의 숫자를 컴퓨터에 어떻게 효과적으로 할당해서 0,1로 표현할지 결정하는 인코딩 방식이 필요하다.
똑똑한 사람들이 인코딩하는 규칙을 정했는데, 그 중 한가지 방법이 UTF-8 방식이다. (UCS-2
,UCS-4
,UTF-32
,UTF-16
,UTF-8
등이 있음)
문자마다 적절한 바이트 수를 차지하도록 해서 다른 방식들보다 일반적으로 적은 용량을 쓰면서도 호환문제가 적은 UTF-8
이 전세계적으로 가장 널리 사용된다.
유니코드는 거의 세계 모든 언어를 포함하지만, 대부분의 글자는 2Byte(U+0000~U+FFFF)를 사용해야해서, 알파벳 (기존 1byte만을 활용할 수 있었음)을 사용하는 문서에서는 데이터 양이 2배, 많게는 3배가 된다.
따라서 UTF-8에서는 2byte 혹은 3byte였던 유니코드에서 어떤 문자는 1byte로, 어떤 문자는 4byte로... 가변적인 길이로 문자를 인코딩한다.
똑똑한 사람들이라면? 전세계적으로 자주 활용되는 문자들(영어,숫자 등)을 1byte로 만들고, 잘사용되지 않는 특수문자나 고대문자 등은 4byte쪽으로 인코딩 할것같은데, 실제로 맞다.
UTF-8의 핵심 아이디어는, 자주 활용되지 않는 문자에게는 패널티를, 자주 활용되는 문자는 어드벤티지를 준다는 것이다.(메모리로서) 이 방법을 통해 호환성을 높히면서도 적은 용량을 활용할 수 있게 되었다.
참고로, 'a'는 1byte이고, '가'는 3byte이다. 왜냐고요? 약속입니다..
먼저 등록된 (Unicode가 앞선, 세계화 목적인 유니코드에 빨리 등록되었다는 건 전세계에서 공통적으로 자주 활용된다는 의미와 일맥상통할듯) 영어와 숫자같은 문자는 1byte , 시간상 뒤에 등록된 문자는 4byte와 같이 차별적(?) 혹은 가변적으로 할당하는 방법을 택했다.
아래 표에 이미 다 약속되어있다.
출처 : https://en.wikipedia.org/wiki/UTF-8
위와 같이, 유니코드의 범위에 따라 UTF8 인코딩의 바이트 갯수가 정해진다.
위의 표를 참고하여, 아래 예시를 보면 UTF8인코딩 방식을 쉽게 이해할 수 있다.
위의 예시를 보면, 곰은 U+ACF0이므로 , 표상 3바이트 범위에 속한다. 3바이트 작성법은 위에 표에도 잘 나와있듯이, 1110xxxx/10xxxxxx/10xxxxxx로 그대로 받아적으면 된다.
이 경우엔, "a"는 U+0061이므로, 1바이트 범위에 속하며, 1바이트의 표시형식을 참고하여 다음과 같이 인코딩 된다.
한글은 3바이트 구간에 존재한다. 그래서 한글로 작성된 파일의 경우 파일 크기가 최대 1.5배로 늘어난다. 다만 웹 페이지나 XML 같은 소스코드류의 파일의 경우 한글과 다수의 로마자가 섞여 있기 때문에 EUC-KR로 작성된 파일을 UTF-8로 변환해도 파일 크기가 크게 늘어나지는 않는다. 오히려 UTF-16에서 UTF-8로 변환하면 데이터 크기가 줄어드는데, 한글은 2바이트가 3바이트가 되지만, 로마자는 2바이트가 1바이트로 줄어들기 때문( 통계 )
UTF-16은 다음에....추가로 적어보아야겠다....
내용에 오류가 있다면, 알려주시면 감사합니다.