UTF-8

UTF-8유니코드 문자 인코딩의 대표적 표준이다. 명칭은 Unicode Transformation Format – 8-bit 또는 Universal Coded Character Set Transformation Format – 8-bit의 약자이다.

ASCII 문자는 1바이트로 표현하며, 기타 문자는 2~4바이트로 표현한다. 대부분의 리눅스 배포판macOS에서 표준 인코딩으로 채택되어 사용되고 있으며, 에서도 많이 쓰인다. 대부분의 CJKV 문자(한글·한자·히라가나·가타카나 등)는 3바이트 영역에 들어간다.

UTF-8은 ASCII를 사용하는 프로그램에서도 큰 오작동이 일어날 일이 없다는 장점이 있기 때문에, 애초에 ASCII를 위해 디자인된 유닉스 계열 운영 체제에서는 UTF-8을 권장한다. Microsoft WindowsUTF-16을 사용한다.

구조[편집 | 원본 편집]

첫 번째
코드 포인트
마지막
코드 포인트
첫째 바이트 둘째 바이트 셋째 바이트 넷째 바이트 시작
U+0000 U+007F 0xxxxxxx 00 7F
U+0080 U+07FF 110xxxxx 10xxxxxx C2 80 DF BF
U+0800 U+FFFF 1110xxxx 10xxxxxx 10xxxxxx E0 A0 80 EF BF BF
U+10000 U+10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx F0 90 80 80 F4 8F BF BF

먼저 ASCII 영역의 문자는 첫 비트를 0으로 둬서 1바이트로 끝남을 표시한다. 그 외의 문자는 모든 첫 비트가 1이다.

ASCII 외 문자는 첫째 바이트의 처음 연속한 1의 개수에 따라 몇 바이트로 인코딩할 지를 표시하고, 나머지 바이트는 앞에 10을 붙여서 뒤따르는 바이트임을 나타낸다.

하나의 문자가 여러 가지 방법으로 인코딩될 수 있으나, 올바른 UTF-8 표현은 가장 짧은 것 하나뿐이다. 예를 들어 U+0000은 00, C0 80, D0 80 80, F0 80 80 80과 같이 여러 가지 방법으로 인코딩될 수 있지만, 이 중에서 가장 짧은 00 하나만이 올바른 UTF-8 표현이다.

4바이트 인코딩의 경우, 21비트를 담고 있으므로 이론상으로는 U+1FFFFF까지 표현할 수 있다. 다만 유니코드의 범위가 U+10FFFF까지이기에 이후 범위는 쓰지 않는다.

인코딩 예[편집 | 원본 편집]

1바이트 인코딩
L(U+004C)
  • ASCII 문자이므로 유니코드 값 그대로 01001100으로 나타내며, 16진수로 4C가 된다.
2바이트 인코딩
λ(U+03BB, 그리스 문자 람다 소문자)
  • U+0080과 U+07FF 사이에 있으므로 2바이트로 표현된다.
  • 2진수 값을 5비트와 6비트로 쪼갠다. 00000011 1011101101110 111011
  • 2바이트 패턴인 110xxxxx 10xxxxxx에 넣으면 11001110 10111011이다.
  • 따라서 λ는 UTF-8에서 CE BB로 인코딩된다.
3바이트 인코딩
€(U+20AC, 유로 기호)
  • U+0800과 U+FFFF 사이에 있으므로 3바이트로 표현된다.
  • 0x20AC는 2진수로 0010 0000 1010 1100로 표현된다. 맨 앞에 0 두 개가 추가된 이유는 3바이트 표현은 정확히 16비트를 필요로 하기 때문이다.
  • 이를 1110xxxx 10xxxxxx 10xxxxxx이라는 패턴에 그대로 집어넣는다. 그러면 11100010 10000010 10101100이 된다.
  • 따라서 €는 UTF-8에서 E2 82 AC로 표현된다.
4바이트 인코딩
🙂(U+1F642, 스마일 이모지)
  • U+10000 이후 범위에 속해 있으므로 4바이트로 나타낸다.
  • 2진수 값을 21비트까지 펼치고 3+6+6+6 비트로 쪼갠다. 1 11110110 01000010000 011111 011001 000010
  • 위 표에 써진 패턴을 적용하면 11110000 10011111 10011001 10000010
  • 따라서 해당 이모지의 인코딩 결과는 F0 9F 99 82이다.

URL 인코딩[편집 | 원본 편집]

웹페이지 주소에서 % 기호가 연속으로 붙어 있다면 이는 퍼센트 인코딩이 적용된 것인데, 이때 문자열은 UTF-8 인코딩을 기준으로 나타낸다. 한국어 위키와 같이 한글이 들어가는 URL을 쓴다면 이 형태를 많이 볼 수 있다.

가령 본 문서의 "리브레 위키"로 가는 링크인 https://librewiki.net/wiki/리브레_위키를 퍼센트 인코딩으로 나타낼 때, 위 문단에서 소개한 인코딩 방식으로 출력한다. 이때 UTF-8 인코딩 결과를 각 바이트마다 % 기호를 붙여둔다.

'리'(U+B9AC)를 UTF-8로 나타내면 EB A6 AC가 된다. 여기에 각 바이트에다 %를 붙이면 %EB%A6%AC가 된다. 다른 문자들도 마찬가지 방법으로 인코딩을 거쳐 이어붙이면, 주소는 아래와 같이 출력된다.

https://librewiki.net/wiki/%EB%A6%AC%EB%B8%8C%EB%A0%88_%EC%9C%84%ED%82%A4

참고로 공백의 경우 위키백과나 리브레 위키에서는 언더바(_)로 나타내지만 나무위키에서는 공백도 마찬가지로 위 인코딩을 거쳐 %20으로 출력한다.

각주