UTF8 (8bit UCS/Unicode Tranformation Format)  포맷은 인터넷(웹페이지나 이메일)에서 주로 사용하며, Unicode를 표현하기 위한 새로운 코딩 방법입니다.  일정한 비트 헤더를 갖는 가변길이 코딩 방식으로 1바이트에서 4바이트의 길이를 사용합니다.

유니코드를 그냥 쓰면 되지 왜? 굳이 다른 코딩 방법을 도입을 했을까요? 바로 이점에 의문을 가질수 있습니다.

8비트 문제체계는 0~255 번까지 총 256개의 문자가 정의 되어 있고, 0~127 까지는 아스키(ASCII) 그리고 128~255는 확장 아스키 코드라고 합니다. UNICODE/ANSI 등 다국어를 표현하기 위한 문자는 확장 아스키 코드의 조합으로 이루어져 있습니다.

문제는 사용자가 보여주고자 하는 문자가, 확장 아스키 코드 자체인지 아니면 다른 문자 체계를 보여주고 싶은지에 대한 구분이 불분명하게 됩니다. 또한, 유니코드에서 나라별로 사용되는 문자의 길이는 1~3바이트 까지 다양하기 때문에, 어디서 어디까지가 한문자를 구분하는 것도 쉽지 않습니다. 

인코딩 방법은 Unicode의 값에 따라서, 1~4바이트로 인코딩 하게 되며, 디코딩 할때는 127 이하의 코드는 그대로 ASCII 코드로 간주하고, 128 이상의 코드는 첫번째 바이트의 비트 값을 이용하여 구분하게 됩니다. 

표 : Unicode 와 UTF8 인코딩 비트 분리표  

 Unicode

 Byte 1

  Byte 2

 Byte 3

 Byte 4

 0x000000 ~ 0x00007F

 0xxxxxxx

 

 

 

 0x000080 ~ 0x0007FF

 110xxxxx

 10xxxxxx

 

 

 0x000800 ~ 0x00FFFF

 1110xxxx

 10xxxxxx

 10xxxxxx

 

 0x010000 ~ 0x10FFFF

 11110xxx

 10xxxxxx

 10xxxxxx

 10xxxxxx


이 표를 보면 사용하지 않는 값이 있습니다.

2바이트 인코딩을 보게 되면, 

     (1) 첫번째 바이트 값은 11000000 또는 그 이상의 값이 되어야 합니다. 따라서, 10000000 (0x80) ~ 10111111 (0xBF) 사이의 값이 나올수 없습니다. 
     (2) 첫번째 바이트의 5비트의 값이 000010 이상의 값을 가져야 합니다. 그 이하의 값은 1바이트 인코딩이 되어야 하기 때문입니다.
     (3) 다음 코드는 반드시 10000000(0x80)~10111111(0xBF) 사이의 값을 가져야 합니다.
     (4) 첫번째 바이트가 파일의 맨 마지막 바이트 이면 않됩니다. 즉, 두번째 바이트까지 존재해야 합니다. 

이처럼 2바이트 인코딩에서도 여러가지 엄격한 규칙이 있습니다. 3~4바이트 인코딩은 더 많습니다. ^^
바로, 이 규칙을 이용하여 특정 파일이 UTF8 형식으로 인코딩이 되어 있는지 유무를 판별할 수 있게 됩니다. 
  
윈도우즈용 동작하는 상당수의 대부분의 프로그램은 에서 생성되는 UTF8 형식으로 저장할때, 파일의 처음 부분에, EF BB BF 값을 저장합니다. 이것은 바이트 배열 순서를 표시하는 코드 이지만, 의무 조항이 아니기 때문에 이 부분만 가지고 UTF8 포맷 유무를 판별하기는 매우 힘듭니다.

굳이 UTF8 포맷을 판별하려는 이유는 파일을 읽어 들일때, ANSI 코드는 그냥 읽어 들이면 되지만, UTF8 포맷은 디코딩을 해주어야만 정상적은 UNICODE를 얻을 수 있기 때문에 중요한 부분입니다.


좀더 자세한 정보는 아래의 웹사이트를 추천해 드립니다.

       http://en.wikipedia.org/wiki/UTF8


****** MP4TE 0.3.2.x 에서 자막 파일의 인코딩 형식을 판별하기 위해서 사용합니다.