- UTF-8 kodira Unicode tačke u 1-4 bajta, kompatibilan je sa ASCII i važeći za bilo koji jezik.
- Samosinhronizacija i validacija: Obrasci 0/110/1110/11110 sprečavaju preklapanja i olakšavaju otkrivanje grešaka.
- Web i sistemi: meta skup znakova, ogromna podrška i jednostavna konverzija na Windows/macOS/Linux.
Ako danas čitate ovaj članak, a ne vidite nikakve čudne simbole, to je zahvaljujući UTF-8 kodiranju . Ovo kodiranje omogućava da se slova, akcenti, tehnički simboli, pa čak i emojiji prikazuju na isti način u bilo kojem modernom pregledniku, operativnom sistemu ili klijentu e-pošte. To je najrasprostranjeniji standard na webu i temelj digitalne komunikacije kakvu poznajemo.
Kada uređaj prikazuje tekst, on zapravo obrađuje brojeve . Ovi brojevi su kodne tačke definisane Unicode standardom , a da bismo ih pretvorili u bajtove koji putuju preko mreže ili se čuvaju u datoteci, vršimo transformaciju: UTF-8 . U sljedećim redovima ćete razumjeti šta je to, kako funkcioniše, zašto je postalo standardno, koje su njegove prednosti i ograničenja, te kako izbjeći uobičajene greške.
Šta je UTF-8?
UTF-8 (8-bitni Unicode Transformation Format) je način transformisanja Unicode kodnih tačaka u nizove bajtova . Njegova ključna karakteristika je da koristi promjenjivu dužinu : neki znakovi zauzimaju 1 bajt, dok drugi zahtijevaju 2, 3 ili 4 bajta. Ovo omogućava kompaktne tekstove sa jednostavnim latiničnim znakovima , ali također može predstavljati bilo koji znak iz Unicode repertoara.
Potpuno je kompatibilan sa ASCII kodom : prvih 128 znakova (U+0000 do U+007F) kodirano je jednim bajtom identičnim 7-bitnom ASCII kodu. Ovo je olakšalo prelazak sa starijih sistema i objašnjava veliki dio njegovog uspjeha na internetu, u e-pošti i IETF protokolima.
UTF-8 se ističe svojom robusnošću : uključuje bitove za sinhronizaciju koji omogućavaju pouzdanu identifikaciju početka svakog simbola. Ovo svojstvo samosinhronizacije olakšava detekciju da li sekvenca "izgleda" kao UTF-8 , što je veoma 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. Ovaj broj se naziva kodna tačka i obično se piše heksadecimalno u formatu U+XXXX (ili više cifara ako je potrebno).
Na primjer, Veliko slovo "A" je U+0041U HTML-u to možemo nazvati i A. Vaš računar 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čunaru , na Windowsu možete držati pritisnutu tipku Alt i upisati decimalni numerički kod na numeričkoj tastaturi: na primjer, Alt+65 vraća "A" (pogledajte kompletnu listu Alt kodova ). To je klasična prečica koja pokazuje kako kodovi leže u osnovi znakova koje vidite.
Malo historije: kako je nastao UTF-8
UTF-8 je osmislio Ken Thompson pod vodstvom Roba Pikea 2. septembra 1992. godine. Implementirali su ga u operativni sistem Plan 9 kompanije Bell Labs i zvanično ga predstavili na USENIX-u (San Diego, januar 1993. godine) . Tokom 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 konsolidovan kao UTF-8.
Dizajn je riješio praktične probleme koji su mučili prethodne pokušaje univerzalnog kodiranja: ASCII kompatibilnost, samosinhronizaciju, nedostatak preklapajućih bajtova i jednostavnost otkrivanja grešaka. Ova ravnoteža ga je učinila de facto standardom weba.
Kako UTF-8 funkcioniše ispod haube
UTF-8 grupira znakove prema bajtovima potrebnim za njihovo kodiranje . Broj bajtova zavisi isključivo od Unicode kodne tačke i prati bitne obrasce koji označavaju dužinu sekvence.
- 1 bajt (U+0000 do U+007F)ASCII znakovi. Format:
0xxxxxxxNajznačajniji bit je 0, koji garantuje direktnu kompatibilnost sa ASCII. - 2 bajta (U+0080 do U+07FF): Format
110yyyyy 10xxxxxx. Koristi se za većinu evropskih alfabeta sa dijakritičkim znacima i drugima kao što su grčki, ćirilični, hebrejski ili arapski.. - 3 bajta (U+0800 do U+FFFF): Format
1110zzzz 10yyyyyy 10xxxxxx. Uključuje višejezični osnovni plan (BMP), sa 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 dopunske ravni: napredni matematički simboli, historijski spisi, manje uobičajeni 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 sa 10. Zahvaljujući tome, nastavakni bajt se nikada ne može pojaviti kao početni bajt , a važeći niz nikada ne može biti podniz dužeg niza (princip nepreklapanja).
Ekvivalencija sa UTF-16 i surogat parovima
UTF-16 predstavlja BMP kodne tačke sa jedinicom od 16 bitova. i tačke iznad U+FFFF sa zamjenski parovi u rasponu D800–DFFF. Umjesto toga, UTF-8 uvijek kodira stvarne kodne tačke, a ne UTF-16 jedinice, što izbjegava zabunu sa zamjenama.
Historijski gledano, neki nacrti su dozvoljavali 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 tačku U+00F1, što spada u raspon od dva bajta. Slijedeći obrazac, kodira se kao 110xxxxx 10xxxxxx. Njegova UTF-8 reprezentacija je 0xC3 0xB1Dekodiranje je obrnut proces: čitanje korisnih bitova i rekonstrukcija originalne kodne tačke.
Prednosti i ograničenja UTF-8
Glavne prednosti :
- ASCII podrškaASCII tekstovi su validni u UTF-8 bez promjena.
- univerzalan: može predstavljati bilo koji Unicode znak, uključujući tehničke simbole i emotikone.
- Efikasnost u latinskim tekstovima: kada se koristi 1 bajt za ASCII, štedi prostor u poređenju sa UTF-16 u mnogim zapadnim jezicima.
- Samosinhronizacija i detekcija: bitni obrasci omogućavaju otkriti početak znakova i lako validiraju 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 dužine, 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 zahtijeva BOM jer redoslijed bajtova ne mijenja značenje vrijednosti (najmanja jedinica je bajt). Uprkos tome, Postoji opcionalni BOM, znak U+FEFF kodiran kao EF BB BF na početku datoteke ili toka podataka, što se može koristiti za označavanje „ovo je Unicode/UTF-8“.
Najbolje prakse : Ako se pojavi na početku, neki sistemi ga prihvataju, a drugi ga tretiraju doslovno. U konkatenacijama je preporučljivo ukloniti među-BOM-ove . Uključivanje nije obavezno, a njegova korisnost u UTF-8 je ograničena u poređenju sa 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 sa 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 validnog vodećeg bajta. - Prekoračenjakodiranje s više bajtova nego što je potrebno; na primjer, pokušaj kodiranja ASCII-a s 2 bajta (
0xC0y0xC1su nevažeći). - Zabranjene dužine: 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) su nevažeći. - UTF-16 surogat parovi:
D800–DFFFnisu važeće kodne tačke u Unicodeu; ne bi trebali biti kodirani u UTF-8.
Kada na ekranu vidite znak "�" , najvjerovatnije je to zbog neusklađenosti kodiranja ili datoteke sačuvane u drugoj kodnoj stranici. Rješenje je forsiranje end-to-end UTF-8 kodiranja (datoteka, server, 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. Ovo sprječava nedosljednosti i "pokvarene" znakove. Usvajanje UTF-8 na webu je ogromno ; koristi ga velika većina trenutnih web stranica.
U e-pošti, UTF-8 je široko podržan i preporučen od strane organizacija kao što je Internet Mail Consortium. Konfigurisanje e-mail klijenata 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 dužine u 8-bitnim jedinicama; idealno za web , vrlo efikasno s ASCII i zapadnim jezicima. Odlična kompatibilnost i detekcija grešaka.
UTF-16 : promjenjiva dužina 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 dužina od 32 bita po znaku; vrlo jednostavno za indeksiranje , ali zauzima puno prostora. Rezervisano je za slučajeve kada je veličina sekundarna u odnosu na jednostavnost obrade.
Nekompatibilne varijante: CESU-8 i „Modifikovani UTF-8“
CESU-8 kodira UTF-16 jedinice direktno (uključujući surogatne parove) umjesto kodiranja kodnih tačaka, te se stoga razlikuje od standardnog UTF-8 za znakove iznad U+FFFF. Neke historijske platforme su ga koristile: Oracle 8 ga je nudio pod aliasom UTF-8, a počevši od Oracle 9, dodao je standardni UTF-8 pod drugim aliasom. Java i Tcl su koristili CESU-8 u određenim kontekstima.
Modifikovani UTF-8 (na primjer, u Java okruženjima) predstavlja NUL znak (U+0000) kao 0xC0 0x80 umjesto 0x00. Izbjegava nulti bajt u C stringovima , ali nije kompatibilan sa UTF-8 standardom. Mnoge implementacije ove "modifikovane" verzije su također u skladu sa CESU-8.
UTF-8 na Windowsu i API-ji: Kodne stranice i konverzija
Windows interno radi u UTF-16 (WCHAR) kodiranju, ali od verzije Windowsa 10 1903 možete forsiraj UTF-8 kao kodnu stranicu procesa putem manifesta aplikacije (svojstvo activeCodePage). Ovo olakšava rad naslijeđenog koda koji koristi "-A" API-je preko UTF-8.
API-ji -A u odnosu na -W: the -A zavisi od ANSI kodne stranice konfigurisano (može biti CP_UTF8), dok je -W oni koriste UTF-16Da bi interoperabilno funkcionisali, VišebajtnoDoŠirokogZnaka y ŠirokiZnakUVišeBajt omogućavaju vam konverziju između UTF-8 i UTF-16; SAD CP_UTF8 i, ako je primjenjivo, MB_ERR_INVALID_CHARS da otkriju greške pri unosu.
UTF-8 je kompatibilan sa modernim preglednicima (Chrome, Firefox, Safari, Edge, Opera i novije verzije Internet Explorera) i većinom operativnih sistema (Windows, Linux, macOS, Android, iOS). Osim ako nemate vrlo stari softver, ne biste trebali imati nikakvih problema.
Kako konvertovati datoteke u UTF-8
U Windowsu (Notepad) : otvorite datoteku, idite na "Datoteka > Sačuvaj kao…", a u "Kodiranju" odaberite UTF-8 . Sačuvajte pod novim imenom ako želite zadržati original.
U macOS-u (TextEdit) : U "TextEdit > Preferences > Open & Save" odaberite Unicode (UTF-8) prilikom spremanja. Zatim izvezite datoteku s tom omogućenom opcijom.
Na Linuxu: sa terminalom koji 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 da li je datoteka u UTF-8 kodiranju? Mnogi moderni editori to označavaju u statusnoj traci. Ako vidite čudne znakove poput "�", oštećene akcente ili nepravilno prikazane "ñ/ç", provjerite kodiranje datoteke i postavke editora/servera/baze podataka.
Dobre prakse za izbjegavanje iznenađenja
Deklarišite UTF-8 što je ranije moguće u HTML i HTTP zaglavljima. Poravnajte kodiranje u cijelom steku (izvorne datoteke, predlošci, baza podataka i konekcija). 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 (akcenti, CJK, emojiji) kako bi se otkrile slabe tačke prije produkcije.
UTF-8 je prevladao jer balansira kompatibilnost, efikasnost i doseg . To je najpraktičniji način da se osigura da tekst putuje nepromijenjen kroz kulture, sisteme i aplikacije, bez obzira na to da li sadrži akcente, tehničke simbole ili nelatinična pisma.