´ÙÀ½ ÀÌÀü Â÷·Ê

7. UTF-8Àº ¹«¾ùÀΰ¡?

¹«¾ùº¸´Ù ¸ÕÀú UCS¿Í À¯´ÏÄÚµå´Â ´ÜÁö Á¤¼ö¸¦ ¹®ÀÚ¿¡ ÇÒ´çÇÏ´Â ÄÚµå Å×À̺íÀÏ »ÓÀÌ ¶ó´Â °ÍÀÌ´Ù. ±×·¯ÇÑ ¹®ÀÚ È¤Àº ¹®ÀÚ °¢°¢ÀÇ Á¤¼ö °ªÀÇ ½ÃÄö½º°¡ ¾î¶»°Ô ¹ÙÀÌÆ® ½ÃÄö½º·Î ³ªÅ¸³¯ ¼ö ÀÖ´Â Áö¿¡ ´ëÇÑ ¸î °¡Áö ´ë¾ÈµéÀÌ Á¸ÀçÇÑ´Ù. ´ë´ÜÈ÷ ÀÌÇØÇϱ⠽¬¿î µÎ °³ÀÇ ÀÎÄÚµùÀº À¯´ÏÄÚµå ÅØ½ºÆ®¸¦ 2 ȤÀº 4¹ÙÀÌÆ® ½ÃÄö½ºÀÇ ½ÃÄö½º(sequences of eit her 2 or 4 bytes sequences)·Î½á ÀúÀåÇÑ´Ù. ÀÌ·¯ÇÑ ¿ë¾î¿¡ °üÇÑ °ø½ÄÀûÀÎ ¸íĪÀº °¢ °¢ UCS-2¿Í UCS-4ÀÌ´Ù. ´Ù¸¥ ¹æ¹ýÀ¸·Î ¸í½ÃµÇÁö ¾Ê´Â´Ù¸é, °¡Àå Áß¿äÇÑ ¹ÙÀÌÆ®°¡ À̵éÀÇ Ã¹¹øÂ°·Î ¿Â´Ù(Bigendian convention). ASCII ¶Ç´Â Latin-1 ÆÄÀÏÀº ¸ðµç ASCII ¹ÙÀÌÆ®ÀÇ ¾Õ¿¡ 0x00 ¹ÙÀÌÆ®¸¦ »ðÀÔÇϹǷνá, UCS-2 ÆÄÀÏ·Î º¯È¯½Ãų ¼ö ÀÖ´Ù. UCS-4 ÆÄÀÏÀ» ¿øÇÑ´Ù¸é, ¸ðµç ASCII ¹ÙÀÌÆ® ¾Õ¿¡ ±× ´ë½Å¿¡ ¼¼°³ÀÇ 0x00 ¹ÙÀÌÆ®¸¦ »ðÀÔÇØ¾ß¸¸ ÇÑ´Ù.

À¯´Ð½º ȯ°æ¿¡¼­ UCS-2(¶Ç´Â UCS-4)¸¦ »ç¿ëÇÏ´Â °ÍÀº ¸Å¿ì ½É°¢ÇÑ ¹®Á¦Á¡À» ºÒ·¯¿Â ´Ù. ÀÌ·¯ÇÑ ÀÎÄÚµùÀ» °¡Áø ¹®ÀÚ¿­µéÀº ÆÄÀϸí°ú C ¶óÀ̺귯¸® ÇÔ¼ö ÆÄ¶ó¹ÌÅÍ¿¡¼­ Ưº° ÇÑ Àǹ̸¦ °®´Â '\0' ȤÀº '/'¿Í °°ÀÌ ¸Å¿ì ±¤¹üÀ§ÇÑ ¹®ÀÚ ¹ÙÀÌÆ®¸¦ ºÎºÐÀûÀ¸·Î Æ÷ÇÔÇÒ ¼ö ÀÖ´Ù. ÀÌ¿¡ ´õÇØ, ´ë´Ù¼öÀÇ À¯´Ð½º ÅøµéÀº ASCII ÆÄÀÏÀ» ¿¹»óÇϸç, Å« ¼öÁ¤ÀÌ ¾øÀÌ´Â 16ºñÆ® ´Ü¾îµéÀ» ¹®ÀÚ·Î ÀÐÀ» ¼ö ¾ø´Ù. ÀÌ·¯ÇÑ ÀÌÀ¯ ¶§¹®¿¡ UCS-2´Â ÆÄÀϸí°ú ÅØ½ºÆ® ÆÄÀÏ ¹× ȯ°æ º¯¼ö µî¿¡ ÀûÇÕÇÑ À¯´ÏÄÚµåÀÇ ¿ÜºÎ ÀÎÄÚµù(suitable external encoding of Unicode)ÀÌ ¾Æ´Ï´Ù.

ISO 10646-1 ÀÇ Annex R°ú RFC 2279»ó¿¡ Á¤ÀÇµÈ UTF-8 ÀÎÄÚµùÀº ÀÌ·¯ÇÑ ¹®Á¦Á¡µéÀÌ ¾ø´Ù. À̰ÍÀº À¯´Ð½º ½ºÅ¸ÀÏÀÇ ¿î¿µ üÁ¦ÇÏ¿¡¼­ À¯´ÏÄڵ带 »ç¿ëÇϱâ À§ÇÑ ÀǽÉÇÒ ¿©Áö¾øÀÌ ÁÁÀº ¹æ¹ýÀÌ´Ù.

UTF-8Àº ´ÙÀ½ÀÇ ¼ºÁúÀ» °®°í ÀÖ´Ù:

´ÙÀ½ÀÇ ¹ÙÀÌÆ® ½ÃÄö½º´Â ÇÑ ¹®ÀÚ¸¦ ³ªÅ¸³»±â À§ÇØ »ç¿ëÇÑ´Ù. »ç¿ëµÇ´Â ½ÃÄö½º´Â ±× ¹®ÀÚÀÇ À¯´ÏÄÚµå ¹øÈ£¿¡ µû¶ó ´Þ¶óÁø´Ù.


U-00000000 - U-0000007F:
0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

xxxºñÆ®ÀÇ À§Ä¡´Â ÀÌÁø Ç¥±â¹ý¿¡ ÀÇÇØ ¹®ÀÚ ÄÚµå ¹øÈ£ÀÇ ºñÆ®µé·Î ä¿öÁø´Ù. ¿À¸¥ÂÊÀÇ xºñÆ®´Â º°·Î Áß¿äÇÏÁö ¾Ê´Ù. ±× ¹®ÀÚÀÇ ÄÚµå ¹øÈ£¸¦ ³ªÅ¸³»´Â ¿ÀÁ÷ °¡Àå ªÀº ¸ÖƼ¹ÙÀÌÆ® ½ÃÄö½º¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¸ÖƼ¹ÙÀÌÆ® ½ÃÄö½º¿¡¼­ ù ¹øÂ° ¹ÙÀÌÆ®ÀÇ ¿ÞÂÊ 1ºñÆ®ÀÇ ¼ö´Â Àüü ½ÃÄö½º¿¡¼­ÀÇ ¹ÙÀÌÆ® ¼ö¿Í °°´Ù´Â Á¡¿¡ ÁÖÀÇÇ϶ó.

¿¹: "À¯´ÏÄÚµå ¹®ÀÚ U+00A9 = 1010 1001"(ÀúÀÛ±Ç ºÎÈ£)´Â ´ÙÀ½°ú °°Àº UTF-8¿¡ µû¶ó ÀÎÄÚµùµÈ´Ù.

11000010 10101001 = 0xC2 0xA9

±×¸®°í ¹®ÀÚ U+2260 = 0010 0010 0110 0000(ÀúÀÛ±Ç ºÎÈ£)´Â ´ÙÀ½°ú °°Àº UTF-8¿¡ µû¶ó ÀÎÄÚµùµÈ´Ù.

11100010 10001001 10100000 = 0xE2 0x89 0xA0

ÀÌ·¯ÇÑ ÀÎÄÚµùÀÇ °ø½Ä ¸íΰú Á¤È®ÇÑ Ç¥±â´Â UTF-8À̸ç, UTF´Â UCS Transformation FormatÀ» ÀǹÌÇÑ´Ù. utf8ȤÀº UTF_8°ú °°Àº ´Ù¸¥ ¹æ¹ýÀ¸·Î UTF-8À» ¹®¼­¿¡ ¾²Áö¸¶¶ó. ¹°·Ð ÀÎÄÚµù ÀÚü¸¦ ÂüÁ¶ÇÏÁö ¾Ê°í º¯¼ö¸í¿¡ ÂüÁ¶ÇÒ °æ¿ì¿¡´Â±¦Âú´Ù.

UTF-8ÀÇ µðÄÚµù ó¸® ¼ø¼­¿¡ À־ Áß¿äÇÑ Á¡Àº ´ÙÀ½°ú °°´Ù: º¸¾È»óÀÇ ÀÌÀ¯ ¶§¹®¿¡, UTF-8 µðÄÚ´õ´Â ÇÑ ¹®ÀÚ¸¦ ÀÎÄÚµùÇϱâ À§Çؼ­ ÇÊ¿ä ÀÌ»óÀ¸·Î ±ä UTF-8 ½ÃÄö½º¸¦ ¹Þ¾Æµé¿©¼­´Â ¾È µÈ´Ù. ¿¹¸¦ µé¾î U+000A(¶óÀÎ Çǵå) ¹®ÀÚ´Â ¿ÀÁ÷ 0x0A Çü½ÄÀ¸·Î UTF-8 ½ºÆ®¸²À¸·ÎºÎÅÍ ¹Þ¾Æµé¿©¾ß¸¸ Çϸç, ´ÙÀ½ÀÇ ´Ù¼¸°¡Áö¿Í °°ÀÌ °úµµÇÏ°Ô ±ä(overlong) Çü½ÄÀ¸·Î ¹Þ¾Æµé¿©¼­´Â ¾ÈµÈ´Ù.

  0xc0 0x8A
  0xe0 0x80 0x8A
  0xf0 0x80 0x80 0x8A
  0xf8 0x80 0x80 0x80 0x8A
  0xfc 0x80 0x80 0x80 0x80 0x8A

°¡Àå ªÀº ÀÎÄÚµùÀ» ã±â À§ÇÑ UTF-8 ¼­ºê½ºÆ®¸µ Å×½ºÆ®¸¦ ¹«½ÃÇϱ⠾ °úµµÇÏ°Ô ±ä UTF-8 ½ÃÄö½º¸¦ ³²¿ëÇÒ ¼ö ÀÖ´Ù. ¸ðµç °úµµÇÏ°Ô ±ä Çü½ÄÀÇ UTF-8 ½ÃÄö½º´Â ´ÙÀ½ÀÇ ¹ÙÀÌÆ® ÆÐÅÏ Áß ÇÑ °¡Áö·Î ½ÃÀÛÇÑ´Ù.


1100000x (10xxxxxx)
11100000 100xxxxx (10xxxxxx)
11110000 1000xxxx (10xxxxxx 10xxxxxx)
11111000 10000xxx (10xxxxxx 10xxxxxx 10xxxxxx)
11111100 100000xx (10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx)

Á¤»óÀûÀÎ UTF-8 ȤÀº UCS-4 µ¥ÀÌÅͻ󿡼­ ÄÚµå À§Ä¡ U+FFFE¿Í U+FFFF »Ó¸¸ ¾Æ´Ï¶ó ÄÚµå À§Ä¡ U+D800 ºÎÅÍ U+DFFF(UTF-16 ´ë¿ë)±îÁö´Â »ç¿ëÇØ¼­´Â ¾È µÈ´Ù. UTF-8 µðÄÚ´õ´Â ÀÌ·¯ÇÑ °ÍµéÀ» ¾ÈÀü¼ºÀ» ÀÌÀ¯·Î, À߸øµÈ Çü½ÄÀ¸·Î ȤÀº ³Ê¹« ±ä ½ÃÄö½º·Î Ãë±ÞÇØ¾ß ¸¸ ÇÑ´Ù.

Markus KuhnÀÇ UTF-8 decoder stress test fileÀº À߸øµÈ Çü½ÄÀ» °®´Â °úµµÇÏ°Ô ±ä UTF-8 ½ÃÄö½ºÀÇ Ã¼°èÀûÀÎ ¸ðÀ½À» Æ÷ÇÔÇϰí ÀÖÀ¸¸ç µðÄÚ´õÀÇ °­·ÂÇÔÀ» Áõ¸íÇØÁØ´Ù.


´ÙÀ½ ÀÌÀü Â÷·Ê