- UTF-8 kodira Unicode točke u 1-4 bajta, kompatibilan je s ASCII-jem i valjan za bilo koji jezik.
- Samosinhronizacija i validacija: Uzorci 0/110/1110/11110 sprječavaju preklapanja i olakšavaju otkrivanje pogrešaka.
- Web i sustavi: meta skup znakova, masovna podrška i jednostavna konverzija na Windowsima/macOS-u/Linuxu.
Ako danas čitate ovaj članak i ne vidite nikakve čudne simbole, to je zahvaljujući UTF-8 kodiranju . Ovo kodiranje omogućuje da se slova, naglasci, tehnički simboli, pa čak i emojiji prikazuju na isti način u bilo kojem modernom pregledniku, operativnom sustavu ili klijentu e-pošte. To je najrašireniji standard na webu i temelj digitalne komunikacije kakvu poznajemo.
Kada uređaj prikazuje tekst, on zapravo obrađuje brojeve . Ti brojevi su kodne točke definirane Unicode standardom , a da bismo ih pretvorili u bajtove koji putuju mrežom ili se spremaju u datoteku, izvodimo transformaciju: UTF-8 . U sljedećim retcima shvatit ćete što je to, kako radi, zašto je postalo standardno, njegove prednosti i ograničenja te kako izbjeći uobičajene pogreške.
Što je UTF-8?
UTF-8 (8-bitni Unicode Transformation Format) je način pretvaranja Unicode kodnih točaka u nizove bajtova . Njegova ključna značajka je korištenje promjenjive duljine : neki znakovi zauzimaju 1 bajt, dok drugi zahtijevaju 2, 3 ili 4 bajta. To omogućuje kompaktne tekstove s jednostavnim latiničnim znakovima , ali također može predstavljati bilo koji znak iz Unicode repertoara.
Potpuno je kompatibilan s ASCII-jem : prvih 128 znakova (U+0000 do U+007F) kodirano je jednim bajtom identičnim 7-bitnom ASCII-ju. To je olakšalo prijelaz sa starijih sustava i objašnjava velik dio njegovog uspjeha na internetu, u e-pošti i IETF protokolima.
UTF-8 se ističe svojom robusnošću : uključuje sinkronizacijske bitove koji omogućuju pouzdanu identifikaciju početka svakog simbola. Ovo svojstvo samosinkronizacije olakšava otkrivanje "izgleda" li niz kao UTF-8 , što je vrlo korisno u alatima i parserima.
Unicode: Temelj svega
Unicode je univerzalni standard koji svakom znaku dodjeljuje jedinstveni broj , bez obzira na jezik, platformu ili aplikaciju. Taj se broj naziva kodna točka i obično se piše heksadecimalno u formatu U+XXXX (ili više znamenki ako je potrebno).
Npr. Veliko slovo "A" je U+0041U HTML-u to možemo nazvati i A. Vaše računalo ne "misli" o A kao o slovu, već kao o broju 65., a zatim kodiranje (kao što je UTF-8) odlučuje kako predstaviti taj broj u bajtovima.
Ako želite vidjeti kako se Unicode prevodi u znakove na vašem računalu , u sustavu Windows možete držati pritisnutu tipku Alt i upisati decimalni numerički kod na numeričkoj tipkovnici: na primjer, Alt+65 vraća "A" (pogledajte cijeli popis Alt kodova ). To je klasičan prečac koji pokazuje kako kodovi leže u osnovi znakova koje vidite.
Malo povijesti: kako je nastao UTF-8
UTF-8 je osmislio Ken Thompson pod vodstvom Roba Pikea 2. rujna 1992. Implementirali su ga u operativni sustav Plan 9 tvrtke Bell Labs i službeno predstavili na USENIX-u (San Diego, siječanj 1993.) . Tijekom standardizacije, koju je sponzorirala X/Open Joint Internationalization Group (XOJIG) , bio je poznat pod nazivima kao FSS/UTF i UTF-2 prije nego što je konsolidiran kao UTF-8.
Dizajn je riješio praktične probleme koji su mučili prethodne pokušaje univerzalnog kodiranja: ASCII kompatibilnost, samosinkronizaciju, nedostatak preklapajućih bajtova i jednostavnost otkrivanja pogrešaka. Ova ravnoteža učinila ga je de facto standardom weba.
Kako UTF-8 funkcionira ispod haube
UTF-8 grupira znakove prema bajtovima potrebnim za njihovo kodiranje . Broj bajtova ovisi isključivo o Unicode kodnoj točki i slijedi bitne obrasce koji označavaju duljinu niza.
- 1 bajt (U+0000 do U+007F)ASCII znakovi. Format:
0xxxxxxxNajznačajniji bit je 0, što jamči izravnu kompatibilnost s ASCII-jem. - 2 bajta (U+0080 do U+07FF): Format
110yyyyy 10xxxxxx. Koristi se za većinu europskih alfabeta s dijakritičkim znakovima i drugima poput grčkog, ćiriličnog, hebrejskog ili arapskog.. - 3 bajta (U+0800 do U+FFFF): Format
1110zzzz 10yyyyyy 10xxxxxx. Uključuje višejezični osnovni plan (BMP), s CJK (kineski, japanski, korejski), tehnički simboli i najčešće korišteni znakovi. - 4 bajta (U+10000 do U+10FFFF): Format
11110uuu 10uuzzzz 10yyyyyy 10xxxxxx. Predstavlja dodatne ravnine: napredni matematički simboli, povijesni spisi, rjeđi ideografski simboli itd.
Ključ samosinhronizacije leži u bitovima zaglavlja : 0 za ASCII; 110 za dva bajta; 1110 za tri; 11110 za četiri. Nastavni bajtovi uvijek počinju s 10. Zahvaljujući tome, nastavakni bajt nikada se ne može pojaviti kao početni bajt , a valjani niz nikada ne može biti podniz dužeg niza (princip nepreklapanja).
Ekvivalencija s UTF-16 i surogat parovima
UTF-16 predstavlja BMP kodne točke s jedinicom od 16 bitova. i točke iznad U+FFFF s zamjenski parovi u rasponu D800–DFFF. Umjesto toga, UTF-8 uvijek kodira stvarne kodne točke, a ne UTF-16 jedinice, što izbjegava zabunu sa zamjenskim jedinicama.
Povijesno gledano, neki nacrti su dopuštali 5 ili 6 bajtova u UTF-8 kako bi pokrili širi raspon, ali Unicode i RFC 3629 ograničavaju UTF-8 na maksimalno 4 bajta . ISO/IEC je razmatrao šire opcije, ali one nisu dio trenutnog standarda.
Praktičan primjer: ñ
Znak „ñ“ ima kodnu točku U+00F1, što spada unutar raspona od dva bajta. Slijedeći uzorak, kodira se kao 110xxxxx 10xxxxxx. Njegova UTF-8 reprezentacija je 0xC3 0xB1Dekodiranje je obrnuti proces: čitanje korisnih bitova i rekonstrukcija izvorne kodne točke.
Prednosti i ograničenja UTF-8
Glavne prednosti :
- ASCII podrškaASCII tekstovi su valjani u UTF-8 bez promjena.
- Univerzalan: može predstavljati bilo koji Unicode znak, uključujući tehničke simbole i emojije.
- Učinkovitost u latinskim tekstovima: kada se koristi 1 bajt za ASCII, štedi prostor u usporedbi s UTF-16 u mnogim zapadnim jezicima.
- Samosinhronizacija i detekcija: bitni uzorci omogućuju otkriti početak znakova i s lakoćom validirati sekvence.
Ograničenja i kompromisi :
- CJK tekstovi zauzimaju više prostora od UTF-16 tekstova, gdje mnogi od tih znakova stanu u 2 fiksna bajta.
- Troškovi izračuna: budući da je promjenjive duljine, neke operacije (npr. „idi na znak n“) potrebno je proći od početka, a određeni zadaci mogu biti brži u UTF-16/UTF-32.
BOM (oznaka redoslijeda bajtova) u UTF-8
UTF-8 ne treba BOM jer redoslijed bajtova ne mijenja značenje vrijednosti (najmanja jedinica je bajt). Unatoč tome, Postoji opcionalna BOM, znak U+FEFF kodiran kao EF BB BF na početku datoteke ili streama, što se može koristiti za označavanje „ovo je Unicode/UTF-8“.
Najbolje prakse : Ako se pojavi na početku, neki sustavi ga prihvaćaju, a drugi ga tretiraju doslovno. U spajanjima je preporučljivo ukloniti među-BOM-ove . Uključivanje nije obavezno, a njegova korisnost u UTF-8 je ograničena u usporedbi s UTF-16/UTF-32, gdje označava endianness.
Tipične greške u kodiranju i kako ih riješiti
Robusni UTF-8 dekoder mora ili odbaciti neispravne sekvence ili ih zamijeniti s U+FFFD (ZAMJENSKI ZNAK) ili označiti grešku. Najčešći kvarovi su:
- Skraćene sekvence: višebajtni vodeći bajt bez dovoljno nastavaka.
- Slobodni bajtovi za nastavak: pojaviti se
10xxxxxxbez valjanog vodećeg bajta. - Prekomjerne duljinekodiranje s više bajtova nego što je potrebno; na primjer, pokušaj kodiranja ASCII-a s 2 bajta (
0xC0y0xC1nisu važeći). - Zabranjene duljine: počinje predlagati 5 ili 6 bajtova (
0xF8-0xFDnisu važeći u standardu UTF-8). - Vrijednosti izvan Unicode raspona: nije podržano iznad U+10FFFFodređene vrijednosti (
0xF5-0xF7kao počeci) nisu valjani. - UTF-16 surogatni parovi:
D800–DFFFnisu valjane kodne točke u Unicodeu; ne smiju se pojaviti kodirani u UTF-8.
Kada na zaslonu vidite znak "�" , najvjerojatnije je to zbog neusklađenosti kodiranja ili datoteke spremljene u drugoj kodnoj stranici. Rješenje je prisilno korištenje UTF-8 kodiranja od početka do kraja (datoteka, poslužitelj, baza podataka, HTTP zaglavlja).
UTF-8 na webu i u e-pošti
HTML stranica treba deklarirati samo jedno kodiranje . Preporučeno kodiranje, radi kompatibilnosti i opsega, je UTF-8. Što prije uključite sljedeću meta oznaku u zaglavlje:
<meta charset="UTF-8">
Postavite ga na početak oznake `<head>` kako bi ga preglednik pročitao prije obrade dokumenta. To sprječava nedosljednosti i "neispravne" znakove. Prihvaćanje UTF-8 na webu je pretjerano ; koristi ga velika većina trenutnih web stranica.
U e-pošti, UTF-8 je široko podržan i preporučen od strane organizacija poput Internet Mail Consortiuma. Konfiguriranje klijenata e-pošte za korištenje UTF-8 smanjuje probleme pri razmjeni poruka s ljudima koji govore drugim jezicima.
UTF-8, UTF-16 i UTF-32: Koja je razlika?
UTF-8 : Kodiranje promjenjive duljine u 8-bitnim jedinicama; idealno za web , vrlo učinkovito s ASCII i zapadnim jezicima. Izvrsna kompatibilnost i otkrivanje pogrešaka.
UTF-16 : varijabilna duljina u 16-bitnim jedinicama; koristi surogatne parove za U+10000 i više. Često je prednost kada prevladavaju znakovi koji nisu ASCII i koristi se u mnogim API-jima i platformama (na primjer, Windows izvorno radi u UTF-16 ).
UTF-32 : fiksna duljina od 32 bita po znaku; vrlo jednostavno za indeksiranje , ali zauzima puno prostora. Rezervirano je za slučajeve kada je veličina sekundarna u odnosu na jednostavnost obrade.
Nekompatibilne varijante: CESU-8 i „Modificirani UTF-8“
CESU-8 izravno kodira UTF-16 jedinice (uključujući surogatne parove) umjesto kodiranja kodnih točaka, što ga razlikuje od standardnog UTF-8 za znakove iznad U+FFFF. Neke povijesne platforme su ga koristile: Oracle 8 ga je nudio pod aliasom UTF-8, a počevši od Oraclea 9, dodao je standardni UTF-8 pod drugim aliasom. Java i Tcl su koristili CESU-8 u određenim kontekstima.
Modificirani UTF-8 (na primjer, u Java okruženjima) predstavlja NUL znak (U+0000) kao 0xC0 0x80 umjesto 0x00. Izbjegava nulti bajt u C nizovima , ali nije kompatibilan sa standardom UTF-8. Mnoge implementacije ove "modificirane" verzije također su kompatibilne sa CESU-8.
UTF-8 na Windowsima i API-jima: Kodne stranice i konverzija
Windows interno radi u UTF-16 (WCHAR) kodiranju, ali od verzije Windowsa 10 1903 možete nametni UTF-8 kao kodnu stranicu procesa putem manifesta aplikacije (svojstvo activeCodePage). To olakšava rad naslijeđenog koda koji koristi API-je "-A" preko UTF-8.
API-ji -A vs -W: the -A ovisi o ANSI kodnoj stranici konfigurirano (može biti CP_UTF8), dok je -W koriste UTF-16Za međuoperaciju, VišebajtnoDoŠirokogZnaka y ŠirokiZnakUVišeBajt omogućuju vam pretvorbu između UTF-8 i UTF-16; namjene CP_UTF8 i, ako je primjenjivo, MB_ERR_INVALID_CHARS za otkrivanje ulaznih pogrešaka.
UTF-8 je kompatibilan s modernim preglednicima (Chrome, Firefox, Safari, Edge, Opera i novije verzije Internet Explorera) i većinom operativnih sustava (Windows, Linux, macOS, Android, iOS). Osim ako nemate vrlo stari softver, ne biste trebali imati problema.
Kako pretvoriti datoteke u UTF-8
U sustavu Windows (Notepad) : otvorite datoteku, idite na "Datoteka > Spremi kao…" i u "Kodiranje" odaberite UTF-8 . Spremite s novim imenom ako želite zadržati izvornik.
U macOS-u (TextEdit) : U "TextEdit > Postavke > Otvori i spremi" odaberite Unicode (UTF-8) prilikom spremanja. Zatim izvezite datoteku s tom omogućenom opcijom.
Na Linuxu: s terminalom možete koristiti iconv, Na primjer: iconv -f <codificación_origen> -t UTF-8 <entrada> -o <salida>. Provjeri kasnije da aplikacija koja ga koristi također očekuje UTF-8.
Kako možete znati je li datoteka u UTF-8 kodiranju? Mnogi moderni urednici to označavaju u statusnoj traci. Ako vidite čudne znakove poput "�", oštećene naglaske ili neispravno prikazane "ñ/ç", provjerite kodiranje datoteke i postavke urednika/poslužitelja/baze podataka.
Dobre prakse za izbjegavanje iznenađenja
Deklarirajte UTF-8 što je ranije moguće u HTML i HTTP zaglavljima. Poravnajte kodiranje u cijelom stogu (izvorne datoteke, predlošci, baza podataka i veza). Izbjegavajte miješanje kodiranja na istoj stranici ili toku i koristite alate koji validiraju/normaliziraju ulaz.
Za integracije i API-je, uvijek navedite kodiranje u zaglavljima (Content-Type: application/json; charset=UTF-8npr.). Testiranje s višejezičnim podacima (naglasci, CJK, emojiji) kako bi se otkrile slabe točke prije produkcije.
UTF-8 je prevladao jer uravnotežuje kompatibilnost, učinkovitost i doseg . To je najpraktičniji način da se osigura da tekst putuje netaknut kroz kulture, sustave i aplikacije, bez obzira uključuje li naglaske, tehničke simbole ili nelatinična pisma.