유니코드(Unicode) 는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준입니다.
좀 더 간단하게 얘기하자면 다음과 같습니다.
글자와 코드가 1:1로 매핑되어 있는 '코드표'
이전에는 '영어'와 특수 문자만을 사용 했고, 이를 위한 메모리로 1byte면 충분했습니다. (0 ~ = 255)
컴퓨터의 발전으로 여러 언어들을 사용하기 위해 전세계 언어를 모두 표시할 수 있는 표준 코드로 만들기로 했는데, 이것이 유니코드입니다.
유니 코드를 위한 가변 길이 문자 인코딩(encoding) 방식 중 하나로, 켄 톰프슨과 롭 파이크(Go언어 창시자)가 만들었다.
풀네임은 Unicode Transformation Format - 8bit이다.
코드 페이지는 65001로, UTF-8로 표현 가능한 길이는 최대 6바이트지만 다른 인코딩과의 호환을 위해 4바이트까지만 사용합니다.
그래서 한 글자가 1 ~ 4바이트 중 하나로 인코딩 될 수 있으며(가변 길이 문자 인코딩 특징), 1바이트 영역은 아스키 코드와 하위 호환성을 가진다. 아스키 코드의 0 ~ 127까지는 UTF-8로 완전히 동일하게 기록된다. 어차피 유니코드는 U+10FFFF까지만(10진법으로는 1,114,111) 이용하는데, UTF-8은 아래에 나와 있듯이 가변 바이트 길이를 선언하기 위해 꽤 많은 비트를 잡아먹고도 2,097,151까지 인코딩할 수 있기 때문에 4바이트 만으로도 충분하고도 남는다.
규칙
좀 더 쉽게 설명을 해보자.
일단, 여기서 말하는 인코딩의 정의부터 짚고 넘어가자.
인코딩: 사용자가 입력한 문자나 기호들을 컴퓨터가 이해할 수 있는 형태로 변환해주는 방식을 말한다.
예를 들어, 암호체계를 임의로 만든다고 생각해보자.
'가'는 0001(=1)로, '나'는 0010(=2)이라고 해보자. 내가 '가나나가'라고 쓰면 컴퓨터에는 0001 0010 0010 0001로 저장합니다. 글자당 1byte로 할당해 4byte로 저장할 수 있고 00010010 00100001처럼 2byte로 저장할 수도 있습니다. 이건 사용자와 컴퓨터간의 '약속'입니다.
여기서 UTF-8은 가변 인코딩 방식이라고 했는데, 쉬운말로 하자면 글자마다 byte 길이가 다르다는 것입니다. 'a'는 1byte이고 '가'는 3byted이다. 가변을 구분하기 위해 첫 바이트에 표식을 넣었는데 2 byte는 110을 시작하고 3byte는 1110으로 시작합니다. 나머지 바이트는 10으로 시작합니다. 이유는 그냥 '약속'이라고 생각하면 됩니다.
- 유니코드가 널리 쓰이기 전부터 형성된 인터넷 문서들은 대부분 아스키 코드를 기본으로 해서 작성 되었고, 특히 기존의 HTML 태그나 자바스크립트 등 아스키로 구축된 사이트를 별다른 변환 처리 없이 그대로 쓸 수 있다.
- UTF-16 인코딩을 사용하면 1바이트로도 표현할 수 있는 문자에 더 많은 바이트를 소비해야 하는데, UTF-8 인코딩을 사용하면 그런 문제점이 없다.
- 혼돈의 여지가 없는 단일 인코딩 방식
- 한자나 한글은 주로 3바이트 영역에 집중되어 있기 때문에 거의 모든 문자에 균일하게 2바이트만 사용하는 UTF-16에 비해 오히려 크기가 커진다.
- 용량 문제는 일단 압축하면 다른 인코딩과 별 차이 없는 데다 텍스트가 아무리 커져 봐야 얼마 안 되기 때문에 이미지/영상/빅데이터 시대에는 아무 문제 없다.
세계적으로 UTF-8 인코딩이 가장 널리 쓰이기 때문에 유니코드를 지원하는 대부분의 프로그램들은 일단 UTF-8을 디폴트 상태로 지정해 주는 경우가 많다. 웹 등지에서 유니코드 적용이 서구권을 중심으로 퍼졌기에 서구권 입장에서는 기존 8비트 코드(1바이트 아스키 코드)와 호환성이 있는 UTF-8을 많이 선택했고, 결국 이것이 대세가 된 것이다.
Reference