UTF-8, UTF-16 차이

IT 2014.12.12 14:16

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이 유리하다. 


참고문헌 : 

http://en.wikipedia.org/wiki/UTF-8

http://en.wikipedia.org/wiki/UTF-16


Posted by Picky Kang