유니코드와 UTF-8

서정범·2023년 3월 28일
0

CS

목록 보기
1/7

유니코드(Unicode)란?

유니코드(Unicode) 는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준입니다.

좀 더 간단하게 얘기하자면 다음과 같습니다.

글자와 코드가 1:1로 매핑되어 있는 '코드표'

이전에는 '영어'와 특수 문자만을 사용 했고, 이를 위한 메모리로 1byte면 충분했습니다. (0 ~ 282^8 = 255)

컴퓨터의 발전으로 여러 언어들을 사용하기 위해 전세계 언어를 모두 표시할 수 있는 표준 코드로 만들기로 했는데, 이것이 유니코드입니다.

UTF-8란?

유니 코드를 위한 가변 길이 문자 인코딩(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바이트 만으로도 충분하고도 남는다.

규칙

  1. 1개 바이트를 사용:
    • 가장 큰 비트에 0을 할당하고, 나머지 7비트에 기존의 아스키 코드를 모두 할당한다. 0xxxxxxx 값을 모두 사용하였다. (아직 1xxxxxxx는 사용 가능한 상황이다.)
  2. 사용하려는 바이트가 2개가 넘을 때: 첫 바이트에는 몇바이트를 사용하는지 알려주는 비트를 먼저 넣는다.
    • 2바이트(110), 3바이트(1110), 4바이트(11110)
    • 나머지 바이트에는 여러 바이트에서 연결되었음을 알리는 비트를 먼저 넣는다. 이 때 2바이트 표식을 넣은 데이터와 겹치지 않도록, 10 이라는 비트를 넣어준다.
  3. 표식 비트가 아닌 나머지 비트들은 모두 데이터 비트로 사용한다.

좀 더 쉽게 설명을 해보자.

일단, 여기서 말하는 인코딩의 정의부터 짚고 넘어가자.

인코딩: 사용자가 입력한 문자나 기호들을 컴퓨터가 이해할 수 있는 형태로 변환해주는 방식을 말한다.

예를 들어, 암호체계를 임의로 만든다고 생각해보자.

'가'는 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으로 시작합니다. 이유는 그냥 '약속'이라고 생각하면 됩니다.

장단점

장점

  1. 유니코드가 널리 쓰이기 전부터 형성된 인터넷 문서들은 대부분 아스키 코드를 기본으로 해서 작성 되었고, 특히 기존의 HTML 태그나 자바스크립트 등 아스키로 구축된 사이트를 별다른 변환 처리 없이 그대로 쓸 수 있다.
  1. UTF-16 인코딩을 사용하면 1바이트로도 표현할 수 있는 문자에 더 많은 바이트를 소비해야 하는데, UTF-8 인코딩을 사용하면 그런 문제점이 없다.
  1. 혼돈의 여지가 없는 단일 인코딩 방식

단점

  1. 한자나 한글은 주로 3바이트 영역에 집중되어 있기 때문에 거의 모든 문자에 균일하게 2바이트만 사용하는 UTF-16에 비해 오히려 크기가 커진다.
  1. 용량 문제는 일단 압축하면 다른 인코딩과 별 차이 없는 데다 텍스트가 아무리 커져 봐야 얼마 안 되기 때문에 이미지/영상/빅데이터 시대에는 아무 문제 없다.

UTF-8 인코딩이 디폴트인 이유?

세계적으로 UTF-8 인코딩이 가장 널리 쓰이기 때문에 유니코드를 지원하는 대부분의 프로그램들은 일단 UTF-8을 디폴트 상태로 지정해 주는 경우가 많다. 웹 등지에서 유니코드 적용이 서구권을 중심으로 퍼졌기에 서구권 입장에서는 기존 8비트 코드(1바이트 아스키 코드)와 호환성이 있는 UTF-8을 많이 선택했고, 결국 이것이 대세가 된 것이다.


Reference

profile
개발정리블로그

0개의 댓글