Koks skirtumas tarp UTF-8 ir Unicode

Girdėjau prieštaringas žmonių nuomones - pagal Vikipediją, žiūrėkite čia .

Tas pats, ar ne? Ar kas nors gali paaiškinti?

386
13 марта '09 в 20:06 2009-03-13 20:06 sarsnake yra nustatytas kovo 13 d ., 09:20, 2009-03-13 20:06
@ 13 atsakymų

Norėdami išplėsti kitų gautus atsakymus:

Mes turime daug kalbų, turinčių daug simbolių, kuriuos kompiuteriai puikiai atstovauja. Unicode priskiria kiekvieną simbolį unikalų numerį arba kodo tašką.

Kompiuteriai tvarko numerius, tokius kaip baitai ... praleidžiant istoriją ir ignoruodami atminties problemą, 8 bitų kompiuteriai laikytų 8 bitų baitą kaip didžiausią skaitmeninį bloką, kuris būtų lengvai vaizduojamas aparatūroje, 16 bitų kompiuteriai išplėstų tai yra iki dviejų baitų ir tt

Senieji simbolių kodai, tokie kaip ASCII, priklauso (iki) 8 bitų erai ir tuo metu bando apeiti dominuojančią kalbą, ty anglų kalba, nuo 0 iki 127 (7 bitai). Su 26 raidėmis abėcėlė, tiek didmiesčių, tiek ne kapitalo forma, numeriai ir skyrybos ženklai, kurie labai gerai veikė. ASCII buvo išplėsta į 8 bitą kitomis ne anglų kalbomis, tačiau papildomi 128 numeriai / kodo taškai, kuriuos suteikia šis plėtinys, bus priskirti skirtingiems simboliams, priklausomai nuo rodomos kalbos. ISO-8859 standartai yra dažniausios šios palyginimo formos; ISO-8859-1 ir ISO-8859-15 (taip pat žinomas kaip ISO-Latin-1, latin1, ir taip pat yra dvi skirtingos ISO 8859 standarto versijos).

Tačiau to nepakanka, jei norite atstovauti simbolius iš kelių kalbų, todėl visų turimų simbolių perpildymas į vieną baitą tiesiog neveiks.

Iš esmės yra du skirtingi kodavimo tipai: vienas išplečia vertybių diapazoną, pridedant daugiau bitų. Šių kodų pavyzdžiai yra UCS2 (2 baitai = 16 bitų) ir UCS4 (4 baitai = 32 bitai). Jos iš esmės yra tos pačios problemos kaip ir ASCII ir ISO-8859 standartai, nes jų reikšmių diapazonas vis dar ribotas, net jei riba yra daug didesnė.

Kitame kodavimo tipe naudojamas kintamas skaičius baitų vienam simboliui, o dažniausiai naudojami kodai yra UTF kodai. Visi UTF kodai veikia maždaug tokiu pačiu būdu: pasirinksite bloko dydį, kuris yra 8 bitai UTF-8, 16 bitų UTF-16 ir 32 bitai UTF-32. Tada standartas apibrėžia kelis iš šių bitų kaip vėliavos: jei jie yra nustatyti, kitas blokas vienetų sekoje turėtų būti laikomas to paties simbolio dalimi. Jei jie nėra įdiegti, šis blokas visiškai atitinka vieną simbolį. Taigi dažniausiai vartojami (anglų) simboliai užima tik vieną baitą UTF-8 (du - UTF-16, 4 - UTF-32), tačiau kiti kalbos simboliai gali užimti šešis ar daugiau baitų.

„Multibyte“ koduotės (turiu pasakyti, kad daugiapakopiai paaiškinimai po pirmiau minėtų) turi pranašumą, kad jie yra santykinai efektyvūs erdvėje, tačiau šių operacijų trūkumas, pvz., Ieškoti antraštių, palyginimų ir tt, yra iššifruoti simbolius į „Unicode“ kodo taškus, prieš atliekant tokias operacijas (nors yra keletas nuorodų).

Abu UCS standartai ir UTF standartai koduoja kodo taškus, kaip apibrėžta Unicode. Teoriškai šie kodai gali būti naudojami koduoti bet kokį skaičių (kodavimo palaikymo diapazone), tačiau, žinoma, šie kodai buvo atlikti koduojant Unicode kodus. Ir koks yra jūsų ryšys tarp jų.

„Windows“ vadina „Unicode“ eilutes kaip UTF-16 eilutes, o dauguma UNIX šių dienų naudoja UTF-8. Ryšio protokolai, tokie kaip HTTP, geriausiai veikia su UTF-8, nes bloko dydis UTF-8 yra toks pat, kaip ir ASCII, ir dauguma šių protokolų buvo sukurti ASCII laikais. Kita vertus, UTF-16 suteikia geriausią vidutinę erdvės / apdorojimo našumą, kai atstovaujama visoms gyvenimo kalboms.

Unicode standartas apibrėžia mažiau kodo taškų, nei gali būti pateikiamas 32 bitais. Taigi, visais praktiniais tikslais UTF-32 ir UCS4 tapo vienodais kodais, nes vargu ar turėsite susidoroti su daugiapakopiais simboliais UTF-32.

Tikiuosi, kad ji užpildys kai kurias detales.

400
13 марта '09 в 20:37 2009-03-13 20:37 atsakymas pateikiamas nesvarbus kovo 13 d., 09:37, 2009-03-13 20:37

Deja, Unicode naudojamas įvairiais būdais, priklausomai nuo konteksto. Jo tinkamiausias naudojimas (TJO) yra koduotas simbolių rinkinys, ty simbolių rinkinys ir simbolių ir jų skaičių atitinkančių sveikojo skaičiaus kodų taškų atvaizdavimas.

UTF-8 - simbolių kodavimas - būdas konvertuoti iš baitų sekų simbolių sekomis ir atvirkščiai. Jis apima visą Unicode simbolių rinkinį. ASCII yra koduojamas kaip vienas baitas vienam simboliui, o kiti simboliai - daugiau baitų, priklausomai nuo jų tikslaus kodo taško (iki 4 baitų visiems dabartiniams kodo taškams, ty iki U-0010FFFF, o iš tiesų 4 baitai gali susidoroti su U-001FFFFF ).

Kai Unicode naudojamas kaip simbolių kodavimo pavadinimas (pvz., .NET kodavimas.Unikodas ), tai paprastai reiškia UTF-16 , kuris koduoja dažniausiai naudojamus simbolius kaip du baitus. Kai kurios platformos (ypač .NET ir Java) naudoja UTF-16 kaip savo gimtąjį simbolių kodavimą. Tai sukelia plaukuotas problemas, jei jums reikia nerimauti dėl simbolių, kurie negali būti užkoduoti ta pačia UTF-16 verte (jie koduojami kaip „pakaitinės poros“), tačiau dauguma kūrėjų nesijaudina, IME.

Kai kurios nuorodos į „Unicode“:

178
13 марта '09 в 20:11 2009-03-13 20:11 Atsakymą pateikė Jon Skeet kovo 13 d., 09:11, 2009-03-13 20:11

Leiskite naudoti pavyzdį šiai temai iliustruoti:

 A chinese character: 汉it unicode value: U+6C49 convert 6C49 to binary: 01101100 01001001 

Nieko magija iki šiol tai labai paprasta. Tarkime, mes nusprendėme šį simbolį įrašyti į kietąjį diską. Norėdami tai padaryti, turime išsaugoti simbolį dvejetainiu formatu. Galime tiesiog įrašyti ją kaip "01101100 01001001". Priimta!

Bet palaukite minutę, yra „01101100 01001001“ vienas simbolis arba du simboliai? Jūs žinojote, kad tai yra vienas simbolis, nes sakiau jums, bet kai kompiuteris jį skaito, jis neturi idėjos. Todėl mums reikia tam tikro „kodavimo“, kad galėtume pasakyti kompiuteriui apie tai.

Štai „UTF-8“ taisyklės: http://www.fileformat.info/info/unicode/utf8.htm

 Binary format of bytes in sequence 1st Byte 2nd Byte 3rd Byte 4th Byte Number of Free Bits Maximum Expressible Unicode Value 0xxxxxxx 7 007F hex (127) 110xxxxx 10xxxxxx (5+6)=11 07FF hex (2047) 1110xxxx 10xxxxxx 10xxxxxx (4+6+6)=16 FFFF hex (65535) 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (3+6+6+6)=21 10FFFF hex (1,114,111) 

Pagal pirmiau pateiktą lentelę, jei norime išsaugoti šį simbolį naudodami „UTF-8“ formatą, mums reikia priskirti tam tikrą „antraštę“. Mūsų kinų simbolis turi 16 bitų ilgį (skaitykite binarinę vertę), todėl naudosime 3 eilutės formatą, nes jis suteikia pakankamai vietos:

 Header Place holder Fill in our Binary Result 1110 xxxx 0110 11100110 10 xxxxxx 110001 10110001 10 xxxxxx 001001 10001001 

Parašykite rezultatą vienoje eilutėje:

 11100110 10110001 10001001 

Tai yra kinų personažo „UTF-8“ (dvejetainio) reikšmė! (patvirtinkite: http://www.fileformat.info/info/unicode/char/6c49/index.htm )

Santrauka

 A chinese character: 汉it unicode value: U+6C49 convert 6C49 to binary: 01101100 01001001 embed 6C49 as UTF-8: 11100110 10110001 10001001 
163
14 янв. Atsakymą pateikė Cheng , sausio 14 d. 2015-01-14 12:07 '15 - 12:07 2015-01-14 12:07

Tai nėra tas pats - UTF-8 yra specialus Unicode kodavimo būdas.

Yra daug įvairių kodų, kuriuos galite pasirinkti priklausomai nuo jūsų programos ir duomenų, kuriuos ketinate naudoti. Dažniausiai yra UTF-8, UTF-16 ir UTF-32, kiek aš žinau.

104
13 марта '09 в 20:09 2009-03-13 20:09 atsakymą pateikė Greg, kovo 13'09, 09:09 2009-03-13 20:09

Unicode apibrėžia tik kodo taškus, ty skaičių, kuris žymi simbolį. Kaip išsaugoti šiuos kodo taškus atmintyje, priklauso nuo naudojamo kodavimo. UTF-8 yra vienas iš būdų koduoti Unicode simbolius tarp daugelio kitų.

56
13 марта '09 в 20:14 2009-03-13 20:14 Atsakymą pateikė Martin Cote, kovo 13 d., 09:14, 20:14 2009-03-13 20:14

Unicode yra standartas, kuris kartu su ISO / IEC 10646 apibrėžia Universaliųjų simbolių rinkinį (UCS) , kuris yra visų esamų simbolių, reikalingų beveik visoms žinomoms kalboms atstovauti, viršutinė dalis.

Unicode kiekvienam savo repertuaro simboliui priskiria vardą ir numerį (simbolių kodą arba kodo tašką).

UTF-8 kodavimas - tai būdas atvaizduoti šiuos simbolius skaitmeninėje atmintyje kompiuterio atmintyje. UTF-8 kartoja kiekvieną kodo tašką į oktetų seką (8 bitų baitai)

Pavyzdžiui

UCS simbolis = simbolis Unicode Han

UCS kodo taškas = U + 24B62

UTF-8 kodavimas = F0 A4 AD A2 (hex) = 11110000 10100100 10101101 10100010 (bin)

26
24 февр. Atsakymas pateikiamas naktinių treniruočių metu 24 vasaris. 2013-02-24 21:36 '13, 21:36, 2013-02-24 21:36

Unicode yra standartas, kuris apibrėžia simbolių rinkinį ( UCS ) ir kodavimą ( UTF ) šiam simbolių rinkiniui koduoti. Tačiau apskritai „Unicode“ reiškia simbolių rinkinį, o ne standartą.

Perskaitykite Absoliutus Minimalus Kiekvienas programinės įrangos kūrėjas Absoliučiai turėtų teigiamai žinoti apie Unicode ir simbolių rinkinius (be pasiteisinimų!) Ir Unicode per 5 minutes .

23
13 марта '09 в 20:37 2009-03-13 20:37 atsakymą pateikė Gumbo kovo 13 d., 09:37, 2009-03-13 20:37

Esami atsakymai jau paaiškina daugybę detalių, tačiau čia yra labai trumpas atsakymas su tiesioginiu paaiškinimu ir pavyzdžiu.

Unicode - tai standartas, kuris žymi simbolius į kodo puslapius.
Kiekvienas simbolis turi unikalų kodą (identifikavimo numerį), kuris yra numeris 9731.

UTF-8 yra kodo kodo kodavimas.
Norėdami išsaugoti visus disko įrašus (faile), UTF-8 simbolius skirsto į 4 oktetus (8 bitų sekas) - baitus. UTF-8 yra vienas iš kelių kodų (duomenų pateikimo metodai). Pavyzdžiui, Unikodo (dešimtainio) kodo numeris 9731 reiškia sniego senį (), kurį sudaro 3 baitai UTF-8: E2 98 83

Čia yra surūšiuotas sąrašas su kai kuriais atsitiktiniais pavyzdžiais .

19
19 мая '14 в 16:57 2014-05-19 16:57 atsakymas pateikiamas pagrindiniu6 gegužės 19, 14, 16:57 2014-05-19 16:57

1. Unikodas

Visame pasaulyje yra daug simbolių, pavyzdžiui, „$, h, a, t,?, 张, 1, =, + ...“.

Tada ateina organizacija, kuri paskyrė šiuos simbolius,

Jie sukūrė standartą, vadinamą Unicode.

Standartas yra toks:

  • sukurti formą, kurioje kiekviena pozicija vadinama „kodo tašku“ arba „kodo padėtimi“.
  • Visos pozicijos nuo U + 0000 iki U + 10FFFF;
  • Iki šiol kai kurios pozicijos yra užpildytos simboliais, o kitos pozicijos yra išsaugotos arba tuščios.
  • Pavyzdžiui, padėtis „U + 0024“ užpildyta simboliu „$“.

PS: Žinoma, yra kita organizacija, vadinama ISO, kuri palaiko skirtingą standartą - "ISO 10646", beveik tą patį.

2. UTF-8

Kaip ir anksčiau, U + 0024 yra tik pozicija, todėl negalime įrašyti „U + 0024“ kompiuteryje simboliui „$“.

Turi būti kodavimo metodas.

Tada ateina kodavimo metodai, tokie kaip UTF-8, UTF-16, UTF-32, UCS-2.

UTF-8 kodo taškas "U + 0024" yra užkoduotas 00100100.

00100100 - tai vertė, kurią mes saugome kompiuteryje „$“.

13
05 янв. atsakymas duotas wengeezhang 05 sausis 2015-01-05 12:28 '15, 12:28, 2015-01-05 12:28

Aš patikrinau „Gumbo“ atsakymo nuorodas ir norėjau įterpti kai kuriuos iš šių dalykų, kad egzistuotų kamino perpildymas.

"... Kai kurie žmonės klaidina, kad Unicode yra tik 16 bitų kodas, kuriame kiekvienas simbolis užima 16 bitų, todėl yra 65 536 galimi simboliai. Tai netiesa, iš tikrųjų teisinga. Unicode, taigi, jei manote, kad tai nėra, nesijaučia blogai.

Tiesą sakant, Unicode turi skirtingą mąstymo būdą apie simbolius, ir jūs turėtumėte suprasti, kad Unicode mąstymas apie dalykus ar nieko neturi prasmės.

Iki šiol manėme, kad raidė yra susijusi su kai kuriais bitais, kuriuos galite saugoti diske arba atmintyje:

A → 0100 0001

Unikode, raidė yra susieta su vadinamuoju kodo tašku, kuris tebėra teorija. Kaip šis kodo taškas yra atvaizduotas atmintyje arba diske, yra dar viena istorija ... "

"... Kiekviena abėcėlės raidė kiekvienai abėcėlės raidei Unicode konsorciumui priskiriama magiškam skaičiui: U + 0639. Šis magijos numeris vadinamas kodo tašku U + reiškia" Unicode ", o skaičiai yra šešioliktainiai, U + 0639 - arabų raidė Ain. Anglų raidė A bus U + 0041 .... "

"... Gerai, tarkime, kad turime eilutę:

Sveiki

kuris Unicode atitinka šiuos penkis kodo taškus:

U + 0048 U + 0065 U + 006C U + 006C U + 006F.

Tik kodo taškų krūva. Tiesą sakant, skaičiai. Mes dar nesakėme apie tai, kaip jį saugoti atmintyje arba atstovauti jį el.

"... Štai kodai ateina.

Ankstyviausia „Unicode“ kodavimo idėja, kuri paskatino dviejų baitų mitą, buvo, tiesiog, išsaugokite šiuos numerius po du baitus. Taigi, Hello tampa

00 48 00 65 00 6C 00 6C 00 6F

Gerai? Ne taip greitai! Tai negali būti:

48 00 65 00 6C 00 6C 00 6F 00? ... "

12
30 мая '11 в 12:37 2011-05-30 12:37 atsakymą pateikė kommradHomer gegužės 30 d. 11, 12:37 2011-05-30 12:37

Unicode yra plačiajuosčio ryšio standartas, kuris apibrėžia daugiau nei 130 000 simbolių ir pabrėžia kiekvieną skaitmeninį kodą („kodas“). Jame taip pat nustatytos šio teksto rūšiavimo taisyklės, jas normalizuojant, keičiant bylą ir tt Unikodo simbolis yra pateikiamas kodo tašku nuo nulio iki 0x10FFFF, įskaitant, nors kai kurie kodo taškai yra rezervuoti ir negali būti naudojami simboliams.

Unikodo kodai gali būti pateikiami daugiau nei viename kode. Paprasčiausias yra UTF-32, kuris paprasčiausiai koduoja kodo tašką kaip 32 bitų sveikieji skaičiai, kurių kiekvienas yra 4 baitai pločio.

UTF-8 yra dar vienas kodavimas ir greitai tampa de facto standartu. Jis koduoja kaip baitų reikšmių seką. Kiekvienas kodas gali naudoti kintamą skaičių šių baitų. Kodo taškai ASCII diapazone yra užkoduoti, kad būtų suderinami su ASCII. Kodo taškai, esantys už šio intervalo ribų, naudoja kintamą baitų skaičių - 2, 3 arba 4, priklausomai nuo to, kokio diapazono jie yra.

UTF-8 buvo sukurta atsižvelgiant į šias savybes:

  • ASCII simboliai koduojami tiksliai taip, kaip jie yra ASCII, todėl ASCII eilutė taip pat galioja kaip UTF-8.

  • Dvejetainis rūšiavimas: UTF-8 eilių rūšiavimas naudojant naivų dvejetainį rūšiavimą vis tiek sukels visų kodo taškų skaičių eilės tvarka.

  • ASCII diapazone esantys simboliai nenaudoja jokių baitų ASCII diapazone, užtikrindami, kad jie negali būti supainioti su ASCII simboliais. Tai taip pat yra saugumo funkcija.

  • Patvirtintojas gali lengvai patikrinti ir atskirti nuo kitų simbolių kodų UTF-8. Tekstas kitose 8 bitų arba kelių bitų koduotėse labai retai tikrinamas kaip UTF-8.

  • Atsitiktinė prieiga: bet kuriame UTF-8 eilutės taške galite nurodyti, ar baitė šioje pozicijoje yra pirmasis simbolio baitas arba ne, ir grįžti į šio simbolio pradžią be jokios nuorodos į eilutės pradžią.

1
26 сент. Atsakymas suteiktas 26 sepų . 2017-09-26 08:05 '17 at 8:05 am 2017-09-26 08:05

UTF-8 yra Unicode simbolių kodavimo metodas, naudojant 8 bitų sekas.

Unicode yra standartas, skirtas daugybei kalbų žymėti daugybe simbolių.

0
26 янв. atsakymą duodamas žinomas kaip „ Mahesh“ 26 d. 2018-01-26 16:35 '18, 16:35 2018-01-26 16:35

Jie yra tie patys, tiesa?

Ne, tai ne.


Manau, kad pirmasis Wikipedia puslapio sakinys, kurį nurodėte, suteikia gerą trumpą santrauką:

UTF-8 yra kintamas pločio kodavimas, galintis koduoti visus 1,112,064 galiojančius Unicode kodo taškus, naudojant vieną – keturis 8 bitų baitus.

Sukurti:

  • Unicode yra standartas, kuris apibrėžia žemėlapį nuo simbolių iki numerių, vadinamųjų kodo taškų (kaip nurodyta toliau pateiktame pavyzdyje). Visą ekraną galite peržiūrėti čia .

     ! -> U+0021 (21), " -> U+0022 (22), \# -> U+0023 (23) 
  • UTF-8 yra vienas iš būdų koduoti šiuos kodo taškus tokiu būdu, kurį kompiuteris gali suprasti, kitaip tariant . Kitaip tariant, tai yra metodas / algoritmas, skirtas kiekvienam iš šių kodų taškų paversti bitų seka arba konvertuoti bitų seką į lygiaverčius kodo taškus. Atkreipkite dėmesį, kad Unicode yra daug alternatyvių kodų.


Čia Joelis pateikia tikrai gerą paaiškinimą ir apžvalgą.

0
11 янв. Atsakymas duotas Dimos 11 sausio. 2018-01-11 22:12 '18, 10:12 pm 2018-01-11 22:12