OS,컴퓨터공학

ASCII 문자, UTF-8, UTF-16

프도의길 2022. 2. 10. 19:03

컴퓨터는 이진수만 안다.

컴퓨터와 내가 문자를 입력하고 출력할 수 있도록 해주는게 바로 문자 코드다.

그리고 문자코드와 숫자를 매칭시킨 표를 문자표라고 한다.

대표적으로 아스키 코드표가 있다.


알파벳, 숫자, 특수 문자에 고유의 숫자를 부여한 코드표로 7Bit 조합이라 128개의 문자를 표현한다.

아스키 코드표의 A가 American을 뜻한다고 한다. 즉, 영어권 국가를 위해서 만들어진 룰이란 것이다.

아스키 코드가 표현할 수 있는 문자가 제한적이다보니 한글이나 중국어 등을 표현할 수 없었다.

이에 다른 국가의 언어들도 문자표를 만들 필요가 생겼고, 여러 문자표들이 만들어지게 된다.

정신차리고 보니 표준룰이 너무 많아져 모든 언어를 표현할 수 있는 문자표가 필요하다고 판단되어 생겨난 것이

유니코드이다.

 

아스키코드표
아래 그림을 보면 0~127까지 각각 고유한 값이 할당되어 있는 걸 알 수 있다. (0부터 시작하니 총 128개)

 

UTF-8과 UTF-16은 Unicode를 표현하는 Encoding 방식이다.

 

UTF-8과 UTF-16의 기본 차이는 문자 하나를 표현할 때 사용할 최소 byte를 의미한다고 볼 수 있다. UTF-8로 문자를 표현할 때 1~4bytes만큼 필요하다. UTF-16은 2bytes(16bit), 4bytes 만큼 필요하다. 두 Encoding 방식의 큰 차이는 최소 8bit가 필요하다 16bit가 필요하냐에 따라 다른 것이다. 최적의 상황(저쟝, 통신 용량을 아껴야할 때)이 필요하다면, 어떤 CodePoint를 주로 사용하냐에 따라 UTF-8 또는 UTF-16을 선택하는 기준이 달라질 것이다.

 

원리를 알면 뭐든지 해결 가능하다고, 인코딩 방식을 알면 도움이 많이 될 것이다. 저장용량을 최대한 아껴야한다면 최적화된 인코딩을 선택하는데 도움을 줄 것이다.

 

 

UTF-8

UTF-8의 표현방식

  U+0000~U+007F : UTF-8 Encoding 0xxx xxxx  8bit (총 1byte)

  U+0080~U+07FF : UTF-8 Encoding 110x xxxx 10xx xxxx 16bit( 2bytes)

  U+0800~U+FFFF : UTF-8 Encoding 1110 xxxx 10xx xxxx 10xx xxxx ( 3bytes)

  U+10000~U+10FFFF : UTF-8 Encoding 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx ( 4bytes)

 

  표현방법을 유심히 살펴보면 알겠지만 다음 규칙을 발견할 수 있다. 

   1. U+0000 ~ U+007F( 기존 ASCII의 0~127)은 8byte로 표현한다. 

 

   2. 가장 첫 바이트의 처음 1이 나오는 갯수만큼 해당 문자의 표현 byte가 결정된다. 

      110 : 2bytes, 1110 : 3bytes, 11110 : 4bytes. 

 

   3. 뒤에 따라오는 바이트에는 모두 10으로 시작하게 하였다. 

 

 

 

UTF-16

 

UTF-16의 표현 방법은 조금 다르다. 복잡해보이지만, 조금만 살펴보면 간단하다. 처음에 대충 살펴보았을 땐 모르겠는데, 차분히 살펴보니 간단한 규칙만 알면 된다.

 

  U+0000~U+FFFF : BMP(Basic Multilingual Plane), 가장 많이 쓰는 문자들이 이 영역에 있다. 

      단, U+D800~U+DFFF 영역은 사용되지 않는다.

  U+10000~U+10FFFF : Supplementary Planes 라 불린다. 계산을 거쳐 4bytes로 저장한다. 

      1. Code Point - 0x10000 = ( 0x0 ~ 0xFFFFF) : 20bit 영역만 남김

      2. 상위 10-bit(0~0x03FF) + 0xD800 을 high surrogate로 할당한다.       

        (0xD800~ 0xDBFF)

      3. 하위 10-bit(0~0x03FF) + 0xDC00 을 low surrogate로 할당한다. 

        (0xDC00~0xDFFF)

 

high surrogate / low surrogate로 활용하여 U+10000 이상 code points를 표현한다. 

 

대세는 UTF-8이다. Web Encoding 의 대부분은 UTF-8이 차지하고 있다. 7bit ASCII 영역은 UTF-8에서 동일하게 Encoding되어 있다. 저장, 통신 용량을 고려하지 않는다면 대세인 UTF-8이다. 하지만 용량이 민감하다면 UTF-8, UTF-16중에서 고민해야한다. 

 

문서에서 많이 사용된 CodePoint들이 몇 Byte로 표현될지 고민 후 결정하면 저장, 통신 용량을 아낄 수 있다. 예를 들어 영문자들로 가득찬 문서의 경우 UTF-8로 표현하면 대부분 1byte로 표현되고 UTF-16으로 표현하면 2byte로 표현되니 UTF-8이 유리하고, 한글의 경우 UTF-8은 3byte, UTF-16은 2byte로 표현되니 UTF-16이 유리하다. 



UTF-8 특징: 바이트 순서가 고정됨

UTF-16에 비해 바이트 순서를 따지지 않고, 순서가 정해져 있습니다.

 

UTF-16 특징: 코드 그대로 바이트로 표현 가능, 바이트 순서가 다양함

UTF-16은 유니코드 코드 대부분(U+0000부터 U+FFFF; BMP) 을 16 bits로 표현합니다.

  • 대부분에 속하지 않는 기타 문자는 32 bit(4 bytes)로 표현하므로 UTF-16도 가변 길이라고 할 수 있으나, 대부분은 2 바이트로 표현합니다

U+ABCD라는 16진수를 있는 그대로 이진법으로 변환하면 1010-1011-1100-1101 입니다. 이 이진법으로 표현된 문자를 16 bits(2 bytes)로 그대로 사용하며, 바이트 순서(엔디언)에 따라 UTF-16의 종류도 달라집니다.

UTF-8에서는 한글은 3 바이트, UTF-16에서는 2 바이트를 차지합니다.

'OS,컴퓨터공학' 카테고리의 다른 글

문자열, 유니코드(인코딩)  (0) 2022.02.10