- UTF-8 koduoja Unicode taškus 1–4 baitais, suderinamas su ASCII ir galioja bet kuriai kalbai.
- Savęs sinchronizavimas ir patvirtinimas: 0/110/1110/11110 šablonai apsaugo nuo persidengimų ir palengvina klaidų aptikimą.
- Žiniatinklis ir sistemos: meta kodų rinkinys, didžiulis palaikymas ir paprastas konvertavimas į „Windows“ / „macOS“ / „Linux“.
Jei šiandien skaitote šį straipsnį ir nematote jokių keistų simbolių, tai UTF-8 kodavimo dėka . Šis kodavimas leidžia raides, diakritinius ženklus, techninius simbolius ir net jaustukus rodyti vienodai bet kurioje šiuolaikinėje naršyklėje, operacinėje sistemoje ar el. pašto kliente. Tai labiausiai paplitęs standartas internete ir skaitmeninės komunikacijos pagrindas, kokį mes jį žinome.
Kai įrenginys rodo tekstą, jis iš tikrųjų apdoroja skaičius . Šie skaičiai yra kodo taškai, apibrėžti Unicode standarto , ir norėdami juos konvertuoti į baitus, kurie keliauja tinklu arba yra įrašomi į failą, atliekame transformaciją: UTF-8 . Šiose eilutėse suprasite, kas tai yra, kaip tai veikia, kodėl tai tapo standartu, kokie yra jo privalumai ir trūkumai bei kaip išvengti dažniausiai pasitaikančių klaidų.
Kas yra UTF-8?
UTF-8 (8 bitų Unicode transformacijos formatas) yra būdas Unicode kodo taškus paversti baitų sekomis . Pagrindinė jo ypatybė yra kintamo ilgio naudojimas : kai kurie simboliai užima 1 baitą, o kitiems reikia 2, 3 arba 4 baitų. Tai leidžia kurti kompaktiškus tekstus su paprastais lotyniškais simboliais , tačiau jis taip pat gali atvaizduoti bet kurį Unicode repertuaro simbolį.
Jis visiškai suderinamas su ASCII : pirmieji 128 simboliai (nuo U+0000 iki U+007F) yra užkoduoti vienu baitu, identišku 7 bitų ASCII. Tai palengvino perėjimą nuo senesnių sistemų ir paaiškina didelę jo sėkmę internete, el. pašte ir IETF protokoluose.
UTF-8 išsiskiria savo patikimumu : jame yra sinchronizavimo bitai, kurie leidžia patikimai identifikuoti kiekvieno simbolio pradžią. Ši savaiminio sinchronizavimo savybė leidžia lengvai aptikti, ar seka „atrodo“ kaip UTF-8 , o tai labai naudinga įrankiuose ir analizatoriuose.
Unikodas: visko pagrindas
Unikodas yra universalus standartas, kuris kiekvienam simboliui priskiria unikalų numerį , nepriklausomai nuo kalbos, platformos ar programos. Šis numeris vadinamas kodo tašku ir paprastai rašomas šešioliktainiu formatu U+XXXX (arba daugiau skaitmenų, jei reikia).
Pavyzdžiui, Didžioji raidė „A“ yra U+0041HTML kalboje taip pat galime tai vadinti A. Jūsų kompiuteris A „negalvoja“ kaip raidės, o kaip skaičiaus 65., o tada kodavimas (pvz., UTF-8) nusprendžia, kaip tą skaičių pavaizduoti baitais.
Jei norite pamatyti, kaip „Unicode“ jūsų kompiuteryje verčiamas į simbolius , sistemoje „Windows“ galite laikyti nuspaudę „Alt“ klavišą ir skaitmeninėje klaviatūroje įvesti dešimtainį skaitmeninį kodą: pavyzdžiui, paspaudus „Alt“ + 65 grąžina „A“ (žr. visą „Alt“ kodų sąrašą ). Tai klasikinis spartusis klavišas, rodantis, kaip kodai atspindi matomus simbolius.
Truputis istorijos: kaip gimė UTF-8
UTF-8 sukūrė Kenas Thompsonas, vadovaujamas Robo Pike'o, 1992 m. rugsėjo 2 d. Jie jį įdiegė „Bell Labs“ sukurtoje „Plan 9“ operacinėje sistemoje ir oficialiai pristatė USENIX parodoje (San Diege, 1993 m. sausį) . Standartizacijos metu, kurią rėmė X/Open Joint Internationalization Group (XOJIG) , jis buvo žinomas tokiais pavadinimais kaip FSS/UTF ir UTF-2, prieš konsoliduojant jį kaip UTF-8.
Šis dizainas išsprendė praktines problemas , kurios kamavo ankstesnius universalaus kodavimo bandymus: ASCII suderinamumas, savęs sinchronizavimas, persidengiančių baitų nebuvimas ir lengvas klaidų aptikimas. Ši pusiausvyra pavertė jį faktiniu žiniatinklio standartu.
Kaip UTF-8 veikia po gaubtu
UTF-8 grupuoja simbolius pagal jiems užkoduoti reikalingų baitų skaičių . Baitų skaičius priklauso tik nuo Unicode kodo taško ir atitinka bitų šablonus, kurie nurodo sekos ilgį.
- 1 baitas (nuo U+0000 iki U+007F)ASCII simboliai. Formatas:
0xxxxxxxSvarbiausias bitas yra 0, kuris garantuoja tiesioginį suderinamumą su ASCII. - 2 baitai (nuo U+0080 iki U+07FF): formatas
110yyyyy 10xxxxxx. Jis naudojamas daugumai Europos abėcėlių su diakritiniais ženklais ir kitoms, pavyzdžiui, graikų, kirilicos, hebrajų ar arabų abėcėlėms.. - 3 baitai (nuo U+0800 iki U+FFFF): formatas
1110zzzz 10yyyyyy 10xxxxxx. Apima daugiakalbį bazinį planą (BMP) su CJK (kinų, japonų, korėjiečių kalbomis), techniniai simboliai ir dažniausiai naudojami rašmenys. - 4 baitai (nuo U+10000 iki U+10FFFF): formatas
11110uuu 10uuzzzz 10yyyyyy 10xxxxxx. Atstovauja papildomoms plokštumoms: sudėtingesni matematiniai simboliai, istoriniai raštai, rečiau vartojami ideografiniai simboliai ir kt.
Savaiminio sinchronizavimo raktas slypi antraštės bituose : 0, jei tai ASCII; 110, jei tai du baitai; 1110, jei tai trys; 11110, jei tai keturi. Tęstiniai baitai visada prasideda skaičiumi 10. Dėl to tęstinis baitas niekada negali būti pradinis baitas , o galiojanti seka niekada negali būti ilgesnės sekos poeiliu (nepersidengiamojo principas).
Ekvivalentiškumas su UTF-16 ir surogatinėmis poromis
UTF-16 žymi BMP kodo taškus, kurių vienetas yra 16 bitų. ir taškai virš U+FFFF su pakaitinių porų diapazone D800–DFFF. Vietoj to UTF-8 visada koduoja tikrus kodo taškus, o ne UTF-16 vienetus, taip išvengiama painiavos su pakaitalais.
Istoriškai kai kuriuose juodraščiuose buvo leidžiama naudoti 5 arba 6 baitus UTF-8 kodo formate, kad būtų galima aprėpti platesnį diapazoną, tačiau „Unicode“ ir RFC 3629 apriboja UTF-8 iki 4 baitų . ISO/IEC svarstė platesnes galimybes, tačiau jos nėra dabartinio standarto dalis.
Praktinis pavyzdys: ñ
Simbolis „ñ“ turi kodo tašką U+00F1, kuris patenka į dviejų baitų diapazoną. Pagal šabloną jis užkoduojamas kaip 110xxxxx 10xxxxxx. Jo UTF-8 atvaizdavimas yra 0xC3 0xB1Dekodavimas yra atvirkštinis procesas: naudingų bitų nuskaitymas ir pradinio kodo taško rekonstravimas.
UTF-8 pranašumai ir apribojimai
Pagrindiniai privalumai :
- ASCII palaikymasASCII tekstai galioja UTF-8 formatu be pakeitimų.
- Universalus: gali žymėti bet kurį Unicode simbolį, įskaitant techninius simbolius ir jaustukus.
- Efektyvumas lotyniškuose tekstuose: kai ASCII naudojamas 1 baitas, taupo vietą, palyginti su UTF-16 daugelyje Vakarų kalbų.
- Savęs sinchronizavimas ir aptikimas: bitų modeliai leidžia aptikti veikėjų pradžią ir lengvai patvirtinti sekas.
Apribojimai ir kompromisai :
- CJK tekstai užima daugiau vietos nei UTF-16 tekstai, kur daugelis šių simbolių telpa į 2 fiksuotus baitus.
- Skaičiavimo kaina: būdamas kintamo ilgio, kai kurios operacijos (pvz., „eiti prie simbolio n“) reikia pereiti nuo pat pradžių, o tam tikros užduotys gali būti atliekamos greičiau naudojant UTF-16/UTF-32.
BOM (baitų eilės žymė) UTF-8 formatu
UTF-8 nereikia BOM nes baitų tvarka nekeičia reikšmių reikšmės (mažiausias vienetas yra baitas). Net ir tokiu atveju, Yra neprivaloma medžiagų specifikacija, simbolis U+FEFF užkoduotas kaip EF BB BF failo arba srauto pradžioje, kuris gali būti naudojamas nurodyti „tai yra Unicode/UTF-8“.
Geriausia praktika : jei jis rodomas pradžioje, kai kurios sistemos jį priima, o kitos interpretuoja pažodžiui. Sujungimuose patartina pašalinti tarpinius BOM . Jo įtraukimas nėra privalomas, o jo naudingumas UTF-8 yra ribotas, palyginti su UTF-16/UTF-32, kur jis žymi pabaigos tašką.
Tipinės kodavimo klaidos ir kaip jas ištaisyti
Patikimas UTF-8 dekoderis turi atmesti netinkamai suformuotas sekas arba pakeisti jas U+FFFD (PAKEITIMO SIMBOLIU) arba pažymėti klaidą. Dažniausios klaidos yra šios:
- Sutrumpintos sekos: kelių baitų įvadinis baitas be pakankamai tęsinių.
- Laisvi tęstiniai baitai: pasirodyti
10xxxxxxbe galiojančio įvadinio baito. - Viršutiniai ilgiai: kodavimas naudojant daugiau baitų nei būtina; pavyzdžiui, bandant koduoti ASCII 2 baitais (
0xC0y0xC1yra negaliojantys). - Draudžiami ilgiai: pradeda siūlyti 5 arba 6 baitus (
0xF8-0xFDnėra galiojantys standartiniame UTF-8). - Reikšmės už Unicode diapazono ribų: nepalaikoma aukštesnėms nei U+10FFFFtam tikros vertės (
0xF5-0xF7(kaip pradžia) yra negaliojantys. - UTF-16 pakaitinių porų:
D800–DFFFnėra galiojantys kodo taškai Unicode formatu; jie neturėtų būti užkoduoti UTF-8 formatu.
Kai ekrane matote simbolį „�“ , greičiausiai tai yra dėl neatitikimo kodavimo arba failo, išsaugoto kitame kodų puslapyje. Sprendimas – priverstinai naudoti nuo galo iki galo UTF-8 kodavimą (failo, serverio, duomenų bazės, HTTP antraštės).
UTF-8 žiniatinklyje ir el. laiškuose
HTML puslapyje reikia deklaruoti tik vieną koduotę . Rekomenduojama koduotė, suderinamumo ir apimties sumetimais, yra UTF-8. Kuo greičiau į antraštę įtraukite šią metažymę:
<meta charset="UTF-8">
Įdėkite jį žymės „<head>“ pradžioje , kad naršyklė jį perskaitytų prieš apdorodama dokumentą. Taip išvengiama neatitikimų ir „neteisingų“ simbolių. UTF-8 naudojimas žiniatinklyje yra didžiulis ; jį naudoja didžioji dauguma dabartinių svetainių.
El. laiškuose UTF-8 yra plačiai palaikomas ir rekomenduojamas tokių organizacijų kaip „Internet Mail Consortium“. El. pašto klientų konfigūravimas naudoti UTF-8 sumažina problemas, kylančias keičiantis pranešimais su žmonėmis, kalbančiais kitomis kalbomis.
UTF-8, UTF-16 ir UTF-32: kuo jie skiriasi?
UTF-8 : kintamo ilgio kodavimas 8 bitų vienetais; idealiai tinka žiniatinkliui , labai efektyvus su ASCII ir Vakarų kalbomis. Puikus suderinamumas ir klaidų aptikimas.
UTF-16 : kintamo ilgio 16 bitų vienetai; naudoja surogatines poras U+10000 ir didesniems simboliams. Tai dažnai naudinga, kai vyrauja ne ASCII simboliai , ir naudojama daugelyje API ir platformų (pavyzdžiui, „Windows“ veikia natūraliai UTF-16 ).
UTF-32 : fiksuotas 32 bitų simbolio ilgis; labai paprasta indeksuoti , bet užima daug vietos. Jis skirtas tais atvejais, kai dydis yra antraeilis dalykas, palyginti su apdorojimo paprastumu.
Nesuderinami variantai: CESU-8 ir „Modified UTF-8“
CESU-8 tiesiogiai koduoja UTF-16 vienetus (įskaitant surogatines poras), o ne koduoja kodo taškus, todėl skiriasi nuo standartinio UTF-8 simboliams, viršijantiems U+FFFF. Kai kurios istorinės platformos jį naudojo: „Oracle 8“ siūlė jį su UTF-8 slapyvardžiu, o pradedant „Oracle 9“, standartinis UTF-8 buvo pridėtas su kitu slapyvardžiu. „Java“ ir „Tcl“ tam tikruose kontekstuose naudojo CESU-8 .
Modifikuotas UTF-8 (pavyzdžiui, „Java“ aplinkose) NUL simbolį (U+0000) pateikia kaip 0xC0 0x80, o ne 0x00. Jis vengia nulinio baito C eilutėse , bet neatitinka UTF-8 standarto. Daugelis šios „modifikuotos“ versijos diegimų taip pat atitinka CESU-8.
UTF-8 sistemoje „Windows“ ir API: kodo puslapiai ir konvertavimas
„Windows“ veikia viduje UTF-16 (WCHAR) kalba, bet nuo „Windows 10“ 1903 versijos galite priverstinai naudoti UTF-8 kaip proceso kodo puslapį per programos manifestą (ypatybė activeCodePage). Tai palengvina senesnio kodo, kuris naudoja „-A“ API, veikimą su UTF-8.
API -A ir -W: -A priklauso nuo ANSI kodo puslapio sukonfigūruotas (gali būti CP_UTF8), o -W jie naudoja UTF-16Kad veiktų kartu, Daugiabaitis_platus_char y Plataus simbolio iki kelių baitų leidžia konvertuoti tarp UTF-8 ir UTF-16; JAV CP_UTF8 ir, jei taikoma, MB_ERR_INVALID_CHARS įvesties klaidoms aptikti.
UTF-8 suderinamas su šiuolaikinėmis naršyklėmis („Chrome“, „Firefox“, „Safari“, „Edge“, „Opera“ ir naujausiomis „Internet Explorer“ versijomis) ir dauguma operacinių sistemų („Windows“, „Linux“, „macOS“, „Android“, „iOS“). Nebent naudojate labai seną programinę įrangą, problemų kilti neturėtų.
Kaip konvertuoti failus į UTF-8
„Windows“ sistemoje („Notepad“) : atidarykite failą, eikite į „Failas“ > „Įrašyti kaip…“ ir skiltyje „Kodavimas“ pasirinkite UTF-8 . Įrašykite nauju pavadinimu, jei norite išsaugoti originalą.
„macOS“ sistemoje („TextEdit“) : „TextEdit“ > „Nuostatos > Atidaryti ir išsaugoti“ pasirinkite „Unicode (UTF-8)“ . Tada eksportuokite failą įjungę šią parinktį.
„Linux“su terminalu, kurį galite naudoti iconv. Por ejemplo: iconv -f <codificación_origen> -t UTF-8 <entrada> -o <salida>. Patikrinkite vėliau kad jį naudojanti programa taip pat tikisi UTF-8.
Kaip sužinoti, ar failas yra UTF-8 formatu? Daugelis šiuolaikinių redaktorių tai nurodo būsenos juostoje. Jei matote keistus simbolius, pvz., „�“, iškraipytus akcentus arba neteisingai rodomą „ñ/ç“, patikrinkite failo koduotę ir redaktoriaus / serverio / duomenų bazės nustatymus.
Geri patarimai, kaip išvengti netikėtumų
HTML ir HTTP antraštėse kuo anksčiau deklaruokite UTF-8 . Suderinkite kodavimą visame steke (šaltinio failuose, šablonuose, duomenų bazėje ir jungtyje). Venkite maišyti koduotes tame pačiame puslapyje ar sraute ir naudokite įrankius, kurie patvirtina / normalizuoja įvestį.
Integracijoms ir API, visada nurodykite kodavimą antraštėse (Content-Type: application/json; charset=UTF-8, pvz.). Testavimas su daugiakalbiais duomenimis (akcentai, CJK, jaustukai), siekiant aptikti silpnąsias vietas prieš gamybą.
UTF-8 buvo populiarus, nes jis suderina suderinamumą, efektyvumą ir aprėptį . Tai praktiškiausias būdas užtikrinti, kad tekstas būtų perkeliamas nepažeistas tarp kultūrų, sistemų ir programų, nepriklausomai nuo to, ar jame yra diakritinių ženklų, techninių simbolių ar nelotyniškų rašmenų.