UTF-8

Из Википедије, слободне енциклопедије
Info non-talk.svg Овом чланку или једном његовом делу је потребно прерађивање.


Чланак је означен овим шаблоном 17.01.2012. и налази се у категорији Рачунарство и информатика‎.
Погледајте како се мења страница или страницу за разговор за помоћ. Уклоните ову поруку када завршите.

UTF-8 варијанта је најзгоднија за кодирање већински латиничног текста. Дато је и кратко упутство за коришћење те варијанте у Microsoft Word-у, Netscape Composer-у и текстуалном едитору Kate. У тексту су такође препоручени стандардни Unicode фонтови који омогућавају лаку преносивост текста са рачунара на рачунар или за објављивање текста на Интернет.

Развој електронског записа текста[уреди]

Први рачунари су били прављени претежно за енглеско говорно подручје и имали су подршку само за енглески алфабет, за бројеве, заграде и још по неки контролни карактер, што је чинило укупно 128 могућих слова (у 7 бита). То је био тзв. ASCII или US-ASCII стандард.

1968. године је скуп карактера проширен на 256 (8 бита), а „горњих“ 128 карактера је било коришћено за додатне карактере. Из неке навике је и овај проширени ASCII називан ASCII, тако да ту често долази до забуне. Да би постојала подршка за више језика, смишљане су тзв. кодне стране (Code Page) које дефинишу понашање тог додатног скупа слова. Основна кодна страна на персоналним рачунарима (PC437) у том горњем сету карактера дефинише разне графичке карактере за цртање текстуалних прозора и слично. Касније је развијено још пуно кодних страна које подржавају одређене језике. Тако постоје Latin1 (ISO-8859-1) за латинична писма Западне Европе (Француска, Немачка, Шпанија, ...), Latin2 (ISO-8859-2) и Windows-1250 за латинична писма Источне Европе (српска латиница и сл.), ISO-8859-5, KOI8-R и Windows-1251 за ћирилицу, итд. Основни проблем са кодним странама је то што се међусобно искључују, тј. цео документ мора да буде написан истим писмом. То углавном није проблем реализовати, али ако би било потребно помешати два писма, као на пример у неком туристичком водичу где заједно постоји и текст на српском, на енглеском и на француском, наилази се на проблем. Због тога се дошло до идеје да се направи јединствени запис за све језике - Јуникод (Unicode) (united - уједињен, заједнички; code - код, запис).

Преглед постојећих верзија Unicode-а[уреди]

Постоји више верзија Unicode-а. Базична верзија је двобајтни формат записа до 216 = 65536 карактера. Њен назив је UCS-2 зато што користи два октета, односно два бајта. Са тих 65536 карактера решен је проблем записа скоро свих постојећих писама (укључујући чак и нека измишљена, као на пример клингонско писмо). Овај тип Unicode-а се назива Plain UCS-2 или UTF-16.

Сада се јавља проблем алокације простора за Unicode поруку на медијуму који се користи. Ако је реч о неком документу на диску, он ће да заузима дупло више простора него конвенционалан документ јер ће се сваки карактер записивати са два бајта уместо само са једним. Ако је реч о преносу података преко рачунарске мреже, биће потребно пренети дупло више података, па ће самим тим и пренос да траје дупло више (односно да кошта дупло више). Поставља се питање да ли је то сувише велика цена за универзално писмо и да ли постоји неки начин да се тај проблем превазиђе и избегне. Као решење увек стоји могућност да се записује неком одговарајућом кодном страницом и троши бајт по карактеру, ако није неопходно коришћење више писама у истом документу (што се ретко дешава). Друго решење је коришћење тзв. трансформационих шеме за погоднији запис и пренос података коришћењем Unicode-а.

Прво је развијена Unicode трансформациона шема са основном јединицом од 8 бита (UTF-8). Помоћу ње се карактер записује у једном, два или три бајта, у зависности од тога о ком је карактеру реч. Ова трансформациона шема је превасходно згодна за употребу у језицима који користе латиницу. О UTF-8 ће бити више речи у поглављу Укратко о UTF-8.

Један део Mail Transfer Agent-а, као и званични стандард за Интернет пошту (IETF: STD 11, RFC 822) подржава само 7-битне маил поруке. MIME стандарди (RFC 2045, RFC 2046, RFC 2047, RFC 2048 и RFC 2049) омогућавају пренос вишебитних речи преко Интернет маил-а, користећи Base64 и Quoted Printable начине кодирања, међутим, они нису прављени за пренос Unicode-а него за пренос било каквих фајлова и нису били најоптималнија решења. Због тога је касније развијена 7-битна трансформациона шема UTF-7. Ту се карактер записује у једном или у неколико бајтова, слично као и у UTF-8. Основна разлика је у томе што UTF-7 користи само Base64 карактере који без проблема могу да се преносе путем електронске поште. За такву намену се показало да је UTF-7 оптималнији запис него UTF-8 када се кодира са Base64 или са Quoted Printable алгоритмима кодирања.

Постоји и новији Unicode стандард под називом UCS-4 који користи 4 бајта за запис 231 = 2147483648 карактера подељених у тзв. равни. Прва два бајта дефинишу раван, тако да има 215 = 32768 равни. Друга два бајта дефинишу карактер унутар равни, тако да има 216 = 65536 карактера по равни. Тај новији формат је више направљен као план за будућност него као реална опција, пошто још увек ни један карактер није алоциран у новодобијени простор, односно сви за сада дефинисани карактери (цео UCS-2) се налазе у равни 0 или основној вишејезичкој равни (Basic Multilingual Plane, BMP). Међутим, пошто је UCS-4 нови стандард за Unicode, треба и њега имати у виду. Да би се UCS-4 транспарентно увео у употребу редефинисани су формати записа UTF-7, UTF-8, UTF-16 и UTF-32. То је учињено тако да сваки карактер из UCS-2 има исту репрезентацију у UTF-7 и UTF-8 као и раније. UTF-16 је у неку руку синоним за UCS-2 и садржи више од два бајта само у случају да се кодира неки карактер ван "Основне језичке равни" (BMP), који за сада не постоје. За више информација, погледајте табелу Шема кодирања UCS-4 у UTF-8. UTF-32 је у ствари начин записа UCS-4 у коме се користе сва четири бајта. Због тога што виши и нижи бајт (или два бајта) могу да се запишу у меморију на два начина, постоје још по две подваријанте UTF-16 и UTF-32 које се разликују по редоследу бајтова. То су UTF-16BE (big endian) и UTF-16LE (little endian) и UTF-32BE и UTF-32LE. Ово није уведено да би се увела додатна забуна и збрка, него зато што различите архитектуре рачунара различито чувају податке.

Такође бих желео да напоменем да постоје две организације које дефинишу два стандарда за Unicode. Један формат је развијен од стране тзв. The Unicode Consortium под називом The Unicode Standard. Други стандард је развила Међународна организација за стандардизацију - International Organization for Standardization, под називом ISO/IEC 10646. Та два стандарда су скоро идентична и разликују се по питању тзв. Хан унификације (представљање јапанских, кинеских и корејских знакова једним јединственим скупом знакова), око додатних карактера за дефинисање акцената, а од скоро и у томе што Unicode Consortium није још подржао UCS-4 стандард. Међутим, за нашу употребу слободно можемо да сматрамо да су потпуно идентични. Међународна организација која дефинише стандарде за Интернет - Internet Engineering Task Force, IETF је у својим стандардима, тзв. "захтевима за коментарима" (Request for Comments, RFC), у којима је дефинисано све што постоји на Интернету, прихватила UTF-7 (RFC 1642 и RFC 2152), UTF-8 (RFC 2044 и RFC 2279) и UTF-16 (RFC 2781), чиме су они и "званично" ушли у употребу на Интернету, тј. свуда. У најновијим стандардима IETF је изоставио Unicode Consortium и користи само верзију ISO 10646, што значи да је званично призната верзија ISO 10646.

У HTML језику за опис веб страница се јављају још два начина за кодирање Unicode карактера. Ови начини троше много више простора него оригинални Unicode запис и намењени су за коришћење унутар неке од кодних страница за убацивање понеког карактера из неке друге кодне странице. Један начин је запис окталних вредности UTF-8 бајтова. Записује се тако што се прво запише карактер \, па онда октална вредност бајта. Ако тај карактер у UTF-8 кодирању садржи више бајтова, сваки бајт се записује на исти начин. Тако на пример карактер Ф чији је UCS-2 код U+0424 (U+ означава да је реч о Unicode карактеру), а UTF-8 запис 0xD0 0xA4 има свој HTML октални запис као \320\244, пошто је 0xD0 = 0320(октални) = 208(децимални) и 0xA4 = 0244 = 164.

Други начин записа Unicode карактера у HTML-у је путем децималне вредности њиховог UCS-2 кода. Записује се тако што се прво запишу карактери &#, па онда децимална вредност UCS-2 кода и на крају карактер ;. Тако би се, на пример, горепоменути карактер Ф са UCS-2 кодом U+0424 записао у HTML децималном запису као Ф, пошто је 0x0424 = 02044 = 1060.

Укратко о UTF-8[уреди]

UTF-8 је замишљен као формат који највише одговара латиничном тексту. То је веома погодно за коришћење у изворном коду програма или у разноразним маркуп језицима (HTML, XML, \LaTeX, ...) јер су стандардне команде тих програмских/маркуп језика увек ASCII, а текст који се користи може да буде и ASCII и UTF-8. На тај начин се не омета рад програмског компајлера или парсера маркуп језика, а омогућава се коришћење вишејезичке подршке.

У UTF-8 се карактер записује у облику једног бајта ако у свом запису садржи само најнижих 7 бита, односно, ако је реч о ASCII карактеру (види поглавље Развој електронског записа текста). Уколико карактер у свом Unicode запису садржи само најнижих 11 бита, у UTF-8 се записује у облику два бајта. И на крају, ако карактер садржи свих 16 бита, записује се у облику три бајта. У табели 1 је дата шема како се UCS-4 трансформише у UTF-8. Табела је дата за пун, четворобајтни Unicode, а ако је реч о двобајтном Unicode-у, тј. о UCS-2, треба гледати само прва три реда у табели. Детаљнији опис алгоритма за трансформацију може се наћи у RFC 2279.

UTF-8 није најоптималнији начин записа за кинески и јапански текст јер уместо да се користе два бајта по карактеру, за такав текст би било коришћено чак три бајта по карактеру, али то и није толико важно за нас. За ћирилични текст је, са друге стране, све једно да ли се користи чисти UNICODE или UTF-8, пошто се сваки ћирилични карактер записује у облику два бајта и у једном и у другом формату. За нас је ипак оптималнији UTF-8 јер постоји могућност писања и ћирилицом и латиницом, па ако у ћирилици већ не може да се избегне употреба два бајта, у латиници се скоро сви карактери записују само са једним бајтом (осим šđčćž).


Табела: Шема кодирања UCS-4 у UTF-8
UCS-4 опсег (hex.) UTF-8 бинарни запис
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0400 0000-7FFF FFFF 1111110x 10xxxxxx ...10xxxxxx

Коришћење UTF-8 у програмима[уреди]

Фонтови који подржавају Unicode[уреди]

Да би се користио Unicode у припреми докумената, потребно је имати одговарајуће фонтове који га (барем делимично) подржавају. Од фонтова доступних на Windows-у, Unicode сигурно подржавају Arial, Times New Roman, Helvetica, Verdana и Courier New фонтови, а такође су инсталирани на свим Windows платформама, тако да би генерално требало да се користи неки од тих фонтова. Фонтови типа TimesCirilica или YULTimes могу да прикажу наше карактере, али су далеко од Unicode-а и у преносу фајла са једног на други рачунар у електронском облику постоји велика шанса да тај фајл неће бити лепо читљив на другом рачунару, тако да би требало да се такви нестандардни фонтови избегавају колико год је то могуће.

На LINUX-у и осталим UNIX-има се у самом називу фонта види да ли подржава уницоде или не, пошто последњи део назива фонта представља character set фонта. Ако ту пише iso10646, то значи да је фонт Unicode компатибилан. Међутим, и овде бих ради преносивости докумената, препоручио да се користе стандардни (Adobe) фонтови, као што су Times (-adobe-times-*-iso10646-1), Utopia (-adobe-utopia-*-iso10646-1), Helvetica (-adobe-helvetica-*-iso10646-1), Courier (-adobe-courier-*-iso10646-1).

Unicode, базе података и XML[уреди]

Светски трендови развоја база података иду ка увођењу Unicode-а, као стандардни начин записа података и XML-а, као стандарни језик за пренос и презентацију тих података.

Већина база података већ дуже време подржава Unicode. Добар део апликација за рад са базама користе XML за презентовање и пренос података, зато што се показало да је XML једноставан језик за програмирање, за који већ постоји пуно парсер-а и зато што се показало да је XML довољно флексибилан да може да пренесе било какав тип података на сличан начин. Да би се програми међусобно "разумели" развијени су разни стандарди за опис података користећи XML (као што је на пример Encoded Archival Description стандард).

То увођење XML-а као главног језика за подршку базама података је још више учврстило позицију Unicode-а, пошто се XML фајлови стандардно пишу у UTF-8 или UTF-16. Занимљива је и та чињеница да је Microsoft, који се углавном противи свим стандардима и труди се да дефинише своје, прихватио XML и користи га где год може. Цела .NET технологија је XML базирана. Због тога може да се очекује да ће у будућности бити само више XML-а и више Unicode-а и да је битно што раније се оријентисати ка њима.

Табела кодова за наша слова[уреди]

У табели 2 су излистани скоро сви карактери који се код нас користе, са својим UCS-2 кодом, UTF-8 записом и са HTML окталним и децималним записима (за више информација погледајте поглавље 2).

Karakter Izgled UTF-8 oktalna decimalna
Velika latinična slova
U+0041 A 0x41 \101 A
U+0042 B 0x42 \102 B
U+0043 C 0x43 \103 C
U+0044 D 0x44 \104 D
U+0045 E 0x45 \105 E
U+0046 F 0x46 \106 F
U+0047 G 0x47 \107 G
U+0048 H 0x48 \110 H
U+0049 I 0x49 \111 I
U+004A J 0x4A \112 J
U+004B K 0x4B \113 K
U+004C L 0x4C \114 L
U+004D M 0x4D \115 M
U+004E N 0x4E \116 N
U+004F O 0x4F \117 O
U+0050 P 0x50 \120 P
U+0051 Q 0x51 \121 Q
U+0052 R 0x52 \122 R
U+0053 S 0x53 \123 S
U+0054 T 0x54 \124 T
U+0055 U 0x55 \125 U
U+0056 V 0x56 \126 V
U+0057 W 0x57 \127 W
U+0058 X 0x58 \130 X
U+0059 Y 0x59 \131 Y
U+005A Z 0x5A \132 Z
Mala latinična slova
U+0061 a 0x61 \141 a
U+0062 b 0x62 \142 b
U+0063 c 0x63 \143 c
U+0064 d 0x64 \144 d
U+0065 e 0x65 \145 e
U+0066 f 0x66 \146 e
U+0067 g 0x67 \147 g
U+0068 h 0x68 \150 h
U+0069 i 0x69 \151 i
U+006A j 0x6A \152 j
U+006B k 0x6B \153 k
U+006C l 0x6C \154 l
U+006D m 0x6D \155 m
U+006E n 0x6E \156 n
U+006F o 0x6F \157 o
U+0070 p 0x70 \160 p
U+0071 q 0x71 \161 q
U+0072 r 0x72 \162 r
U+0073 s 0x73 \163 s
U+0074 t 0x74 \164 t
U+0075 u 0x75 \165 u
U+0076 v 0x76 \166 v
U+0077 w 0x77 \167 w
U+0078 x 0x78 \170 x
U+0079 y 0x79 \171 y
U+007A z 0x7A \172 z
Naša dodatna latinična slova
U+0106 Ć 0xC4 0x86 \304\206 Ć
U+0107 ć 0xC4 0x87 \304\207 ć
U+010C Č 0xC4 0x8C \304\214 Č
U+010D č 0xC4 0x8D \304\215 č
U+0110 Đ 0xC4 0x90 \304\220 Đ
U+0111 đ 0xC4 0x91 \304\221 đ
U+0160 Š 0xC5 0xA0 \305\240 Š
U+0161 š 0xC5 0xA1 \305\241 š
U+017D Ž 0xC5 0xBD \305\275 Ž
U+017E ž 0xC5 0xBE \305\276 ž
Velika ćirilična slova
U+0402 Ђ 0xD0 0x82 \320\202 Ђ
U+0408 Ј 0xD0 0x88 \320\210 Ј
U+0409 Љ 0xD0 0x89 \320\211 Љ
U+040A Њ 0xD0 0x8A \320\212 Њ
U+040B Ћ 0xD0 0x8B \320\213 Ћ
U+040F Џ 0xD0 0x8F \320\217 Џ
U+0410 А 0xD0 0x90 \320\220 А
U+0411 Б 0xD0 0x91 \320\221 Б
U+0412 В 0xD0 0x92 \320\222 В
U+0413 Г 0xD0 0x93 \320\223 Г
U+0414 Д 0xD0 0x94 \320\224 Д
U+0415 Е 0xD0 0x95 \320\225 Е
U+0416 Ж 0xD0 0x96 \320\226 Ж
U+0417 З 0xD0 0x97 \320\227 З
U+0418 И 0xD0 0x98 \320\230 И
U+041A К 0xD0 0x9A \320\232 К
U+041B Л 0xD0 0x9B \320\233 Л
U+041C М 0xD0 0x9C \320\234 М
U+041D Н 0xD0 0x9D \320\235 Н
U+041E О 0xD0 0x9E \320\236 О
U+041F П 0xD0 0x9F \320\237 П
U+0420 Р 0xD0 0xA0 \320\240 Р
U+0421 С 0xD0 0xA1 \320\241 С
U+0422 Т 0xD0 0xA2 \320\242 Т
U+0423 У 0xD0 0xA3 \320\243 У
U+0424 Ф 0xD0 0xA4 \320\244 Ф
U+0425 Х 0xD0 0xA5 \320\245 Х
U+0426 Ц 0xD0 0xA6 \320\246 Ц
U+0427 Ч 0xD0 0xA7 \320\247 Ч
U+0428 Ш 0xD0 0xA8 \320\250 Ш
Mala ćirilična slova
U+0430 а 0xD0 0xB0 \320\260 а
U+0431 б 0xD0 0xB1 \320\261 б
U+0432 в 0xD0 0xB2 \320\262 в
U+0433 г 0xD0 0xB3 \320\263 г
U+0434 д 0xD0 0xB4 \320\264 д
U+0435 е 0xD0 0xB5 \320\265 е
U+0436 ж 0xD0 0xB6 \320\266 ж
U+0437 з 0xD0 0xB7 \320\267 з
U+0438 и 0xD0 0xB8 \320\270 и
U+043A к 0xD0 0xBA \320\272 к
U+043B л 0xD0 0xBB \320\273 л
U+043C м 0xD0 0xBC \320\274 м
U+043D н 0xD0 0xBD \320\275 н
U+043E о 0xD0 0xBE \320\276 о
U+043F п 0xD0 0xBF \320\277 п
U+0440 р 0xD0 0xC0 \320\280 р
U+0441 с 0xD0 0xC1 \320\281 с
U+0442 т 0xD0 0xC2 \320\282 т
U+0443 у 0xD0 0xC3 \320\283 у
U+0444 ф 0xD0 0xC4 \320\284 ф
U+0445 х 0xD0 0xC5 \320\285 х
U+0446 ц 0xD0 0xC6 \320\286 ц
U+0447 ч 0xD0 0xC7 \320\287 ч
U+0448 ш 0xD0 0xC8 \320\290 ш
U+0452 ђ 0xD1 0x92 \321\222 ђ
U+0458 ј 0xD1 0x98 \321\230 ј
U+0459 љ 0xD1 0x99 \321\231 љ
U+045A њ 0xD1 0x9A \321\232 њ
U+045B ћ 0xD1 0x9B \321\233 ћ
U+045F џ 0xD1 0x9F \321\237 џ

Библиографија[уреди]

  1. Филип Брчић.
    Укратко о xml-у, Јануару 2003.
    Укратко о xml-у.
  2. The Unicode Consortium.
    The Unicode Standard - Version 3.0.
    Addison-Wesley, http://www.unicode.org, 2000.
  3. World Wide Web Consortium.
    Extensible markup language (xml) 1.1.
    Candidate recommendation, http://www.w3c.org/TR/xml11, 2002.
  4. M. Davis D. Goldsmith.
    Utf-7 - a mail-safe transformation format of unicode.
    Experimental 1642, Internet Engineering Task Force, http://www.ietf.org/rfc/rfc1642.txt, 1994.
  5. M. Davis D. Goldsmith.
    Utf-7 - a mail-safe transformation format of unicode.
    Informational 2152, Internet Engineering Task Force, http://www.ietf.org/rfc/rfc2152.txt, 1997.
  6. Ulrich Drepper.
    MANPAGE: Iconv(3) 2.2.5 - Perform character set conversion.
    Free Software Foundation, Inc., 2002.
  7. Bojan Marinković <mr99007@alas.matf.bg.ac.rs>.
    Encoded archival description document type definition.
    2003.
  8. K. Moore.
    Multipurpose internet mail extensions (mime) part three: Message header extensions for non-ascii text.
    Standards Track 2047, Internet Engineering Task Force, http://www.ietf.org/rfc/rfc2047.txt, 1996.
  9. J. Postel N. Freed, J. Klensin.
    Multipurpose internet mail extensions (mime) part four: Registration procedures.
    Standards Track 2048, Internet Engineering Task Force, http://www.ietf.org/rfc/rfc2048.txt, 1996.
  10. N. Borenstein N. Freed.
    Multipurpose internet mail extensions (mime) part five: Conformance criteria and examples.
    Standards Track 2049, Internet Engineering Task Force, http://www.ietf.org/rfc/rfc2049.txt, 1996.
  11. N. Borenstein N. Freed.
    Multipurpose internet mail extensions (mime) part one: Format of internet message bodies.
    Standards Track 2045, Internet Engineering Task Force, http://www.ietf.org/rfc/rfc2045.txt, 1996.
  12. N. Borenstein N. Freed.
    Multipurpose internet mail extensions (mime) part two: Media types.
    Standards Track 2046, Internet Engineering Task Force, http://www.ietf.org/rfc/rfc2046.txt, 1996.
  13. F. Yergeau P. Hoffman.
    Utf-16, an encoding of iso 10646.
    Informational 2781, Internet Engineering Task Force, http://www.ietf.org/rfc/rfc2781.txt, 2000.
  14. F. Yergeau.
    Utf-8, a trensformation format of unicode and iso 10646.
    Informational 2044, Internet Engineering Task Force, http://www.ietf.org/rfc/rfc2044.txt, 1996.
  15. F. Yergeau.
    Utf-8, a trensformation format of iso 10646.
    Standards Track 2279, Internet Engineering Task Force, http://www.ietf.org/rfc/rfc2279.txt, 1998.