본문 바로가기
코딩이야기/웹알아보기

문자 인코딩에 대해서 알아보자 - 2편 유니코드로 알아보기

by GiraffeB 2018. 1. 10.
# 유니코드(Unicode)

## 유니코드의 등장배경

유니코드의 이전상황
하나의 언어를 하나의 문자 인코딩으로 매칭되는 시스템이었음.
그러나 A인코딩 사용자가 B인코딩 사용자에게 이메일을 보냈을 때, 서로 호환되지 않는 문제가 발생하였음.
예를들어 "01"이라는 값을 A인코딩은 "A"로표현하고 B인코딩은 "가"로 표현하기 때문임. 

메일을 보낸 측과 동일한 인코딩으로 변환하면 되지 않나는 생각이 들지만, 이 경우에도 하나의 문서에서 2개의 서로 다른 인코딩을 표현하기는 어렵다는 것을 알 수 있음. 

이 2가지 문제는 근본적으로 같은 이유에서 발생함.
각 문자에 대응하는 유일한 코드값이 있다면 한 페이지에서 여러언어를 표현가능하고 이를 해결하기위한 별도의 복잡합 방법을 사용할 이유가 없기 때문에 더 명확함.

그렇게 각 문자마다 유일한 값을 지정하는 유니코드가 등장하게 되었음.


## 문자 인코딩 구조로 보는 유니코드



## 1. 유니코드의 문자 세트

전세계의 문자를 정리해서 문자집합(character set)을 구성했음
2바이트 =  2^16(65536) 개의 숫자로 모두 표현하고자 했지만, 동아시아(한중일의 언어들)의 문자를 정의하고 나니 고대문자 등을 위한 자리가 부족해졌음.
부족한 공간을 확장하기 위해서 기존의 2바이트 =  2^16(65536) 크기의 공간을 하나의 단위로 평면(plane)이라고 부르기로 했음.
이러현 평면이 현재 17개 정해져있고, 대부분의 현대 문자를 0번째 평면에 할당하고 이 0번째 평면을 BMP(Basic multilingual plane)이라고 부름.  우리의 주관심사는 이 영역임.

아래 표는 BMP영역을 보여줌.(동아시아와 CJK문자의 넓은 영역을 볼 수 있음)





문자 인코딩에서 문자 하나에 해당하는 값을 코드 포인트(code point)라고 부르는데, 
유니코드는 코드 포인트를 표현할때 'u+'를 앞에 붙이거나 '\u'를 붙여서 표현함.
예를 들어 'A'의 유니코드 값은 U+0041 또는 \u0041로 표현함. '가'는 U+AC00, u\ac00으로 표현됨. 


아래 테이블은 BMP영역 중 한글 영역의 코드포인트를 보여줌.



유니코드는 전세계의 현대 언어뿐만 아니라 고대 언어들 특수기호들을 담는 거대한 문자세트를 표현하는 목적을 지님.
그래서 아직도 계속 추가되고 있음. 언젠가 모든 언어를 포함하면 추가가 멈출 수 있겠음.


## 2. 유니코드의 문자 인코딩 형태

문자 집합(character set)은 좀 더 추상적임.
유니코드 문자집합의 각각의 코드값으로 직접 표현되기도 하지만, 문자 인코딩 형태의 결과물은 이 코드값과 다를 수 있기 때문임.
같은 문자집합을 사용하는 서로다른 문자 인코딩 형태가 각각 다른 결과물(바이트들)로 표현됨.

유니코드 문자집합을 사용하는 인코딩 종류로는 ucs-2, ucs-4(utf-32), utf-8, utf-16 등이 있음.
대부문의 기술적인 흐름이 그렇듯. 각자의 장점을 내세우며 등장하고, 적용후  단점을 개선하면서 변화함.

유니코드 문자 인코딩 형태에서 나의 주관심사는 utf-8방식임. 대부분의 웹에서 사용되고 있음.
과거의 인코딩에서 주로 변환해야할 인코딩이 utf-8이고, 왜 추천되는지, 상호 변환시 문제점을 알아야하기 때문임.
우선은 이런게 있고 이게 유니코드의 문자 인코딩이라는 점 정도만.


아래는 웹에서 사용되는 인코딩의 연도별 비율임.

https://googleblog.blogspot.kr/2012/02/unicode-over-60-percent-of-web.html




## 3. 문자인코딩 구조
옥텟구조로 구분하는 과정이라고 했다.
BOM(byte order mark)을 통해서 엔디안을 지정해 주는 수준만 하면 된다.