Wat is het verschil tussen UTF-8 en Unicode?

Ik heb tegenstrijdige meningen van mensen gehoord – volgens de wikipedia utf-8 pagina .

ze zijn hetzelfde, toch? Kan iemand verduidelijken?


1, Autoriteit 100%

Uitbreiden op de antwoorden die anderen hebben gegeven:

We hebben veel talen met veel personages die computers idealiter moeten worden weergegeven. Unicode wijst elk teken een uniek nummer of codepunt toe.

Computers behandelen met dergelijke nummers als bytes … een beetje geschiedenis overslaan en het negeren van geheugenadresseringsproblemen, 8-bit computers zouden een 8-bits byte behandelen als de grootste numerieke eenheid die gemakkelijk op de hardware, 16-bit wordt vertegenwoordigd Computers zouden dat uitbreiden tot twee bytes, enzovoort.

Oude karaktercoderingen zoals ASCII zijn van het (pre-) 8-bit tijdperk en proberen de dominante taal in het berekenen op het moment, d.w.z. Engels, in getallen variërend van 0 tot 127 (7 bits). Met 26 letters in het alfabet, zowel in kapitaal als niet-kapitaal, cijfers en leestekens, die behoorlijk goed werkten. ASCII werd door een 8e bit uitgebreid voor andere, niet-Engelse talen, maar de extra 128 nummers / codepunten die door deze expansie beschikbaar zijn gesteld, worden in kaart gebracht naar verschillende tekens, afhankelijk van de weergegeven taal. De ISO-8859-normen zijn de meest voorkomende vormen van deze mapping; ISO-8859-1 en ISO-8859-15 (ook bekend als ISO-Latin-1, Latin1, en ja, er zijn ook twee verschillende versies van de 8859 ISO-norm).

Maar dat is niet genoeg wanneer u karakters uit meer dan één taal wilt weergeven, zodat alle beschikbare personages in een enkele byte worden gekoppeld, werkt gewoon niet.

Er zijn in wezen twee verschillende soorten coderingen: men breidt het waardebereik uit door meer bits toe te voegen. Voorbeelden van deze coderingen zijn UCS2 (2 bytes = 16 bits) en UCS4 (4 bytes = 32 bits). Ze lijden aan inherent hetzelfde probleem als de ASCII- en ISO-8859-normen, omdat hun waardebereik nog steeds beperkt is, zelfs als de limiet enorm hoger is.

Het andere type codering gebruikt een variabel aantal bytes per teken, en de meest bekende coderingen hiervoor zijn de UTF-coderingen. Alle UTF-coderingen werken op ongeveer dezelfde manier: u kiest een eenheidsgrootte, die voor UTF-8 8 bits is, voor UTF-16 is 16 bits, en voor UTF-32 is 32 bits. De standaard definieert vervolgens een paar van deze bits als vlaggen: als ze zijn ingesteld, moet de volgende eenheid in een reeks eenheden als onderdeel van hetzelfde karakter worden beschouwd. Als ze niet zijn ingesteld, vertegenwoordigt dit apparaat één personage volledig. Dus de meest voorkomende (Engelse) tekens bezetten slechts één byte in UTF-8 (twee in UTF-16, 4 in UTF-32), maar andere taalkarakters kunnen zes bytes of meer bezetten.

Multi-byte-coderingen (ik zou na de bovenstaande uitleg na de bovenstaande uitleg moeten zeggen) het voordeel hebben dat ze relatief ruimte-efficiënt zijn, maar het nadeel dat bewerkingen zoals het vinden van substrings, vergelijkingen, enz. Alleen de personages te decoderen Naar Unicode-codepunten voordat dergelijke bewerkingen kunnen worden uitgevoerd (er zijn echter enkele snelkoppelingen).

Zowel de UCS-normen als de UTF-normen coderen de codepunten zoals gedefinieerd in Unicode. In theorie kunnen die coderingen worden gebruikt om een ​​willekeurig nummer in te dienen (binnen het bereik de coderingssteunen) – maar uiteraard zijn deze coderingen gemaakt om Unicode-codepunten te coderen. En dat is jouw relatie tussen hen.

Windows behandelt zogenaamde “Unicode”-tekenreeksen als UTF-16-tekenreeksen, terwijl de meeste UNIXen tegenwoordig standaard UTF-8 gebruiken. Communicatieprotocollen zoals HTTP werken meestal het beste met UTF-8, aangezien de eenheidsgrootte in UTF-8 hetzelfde is als in ASCII, en de meeste van dergelijke protocollen zijn ontworpen in het ASCII-tijdperk. Aan de andere kant geeft UTF-16 de beste gemiddelderuimte/verwerkingsprestaties wanneer alle levende talen worden weergegeven.

De Unicode-standaard definieert minder codepunten dan in 32 bits kunnen worden weergegeven. Dus voor alle praktische doeleinden zijn UTF-32 en UCS4 dezelfde codering geworden, omdat het onwaarschijnlijk is dat u in UTF-32 te maken krijgt met tekens met meerdere eenheden.

Ik hoop dat dit wat details invult.


Antwoord 2, autoriteit 54%

Laat me een voorbeeld gebruiken om dit onderwerp te illustreren:

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

Tot nu toe niets magisch, het is heel eenvoudig. Laten we nu zeggen dat we besluiten dit personage op onze harde schijf op te slaan. Om dat te doen, moeten we het teken in binair formaat opslaan. We kunnen het gewoon opslaan als ‘01101100 01001001’. Klaar!

Maar wacht even, is ‘01101100 01001001’ één of twee tekens? Je wist dat dit een personage was omdat ik het je vertelde, maar als een computer het leest, heeft hij geen idee. We hebben dus een soort van “codering” nodig om de computer te vertellen het als één te behandelen.

Hier komen de regels van ‘UTF-8’ om de hoek kijken: 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)

Volgens de bovenstaande tabel moeten we, als we dit teken in het ‘UTF-8’-formaat willen opslaan, ons teken vooraf laten gaan door enkele ‘headers’. Ons Chinese karakter is 16 bits lang (tel zelf de binaire waarde), dus we zullen het formaat op rij 3 gebruiken omdat het voldoende ruimte biedt:

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

Het resultaat in één regel uitschrijven:

11100110 10110001 10001001

Dit is de UTF-8 (binaire) waarde van het Chinese karakter! (bevestig het zelf: http://www.fileformat.info/info/ unicode/char/6c49/index.htm)

Samenvatting

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001
embed 6C49 as UTF-8:      11100110 10110001 10001001

P.S. Als je dit onderwerp in python wilt leren, klik hier


Antwoord 3, autoriteit 39%

“Unicode” wordt helaas op verschillende manieren gebruikt, afhankelijk van de context. Het meest correcte gebruik (IMO) is als een gecodeerde tekenset– d.w.z. een set tekens en een afbeelding tussen de tekens en integere codepuntendie ze vertegenwoordigen.

UTF-8 is een tekencodering – een manier om te converteren van sequenties van bytes naar sequenties van personages en vice versa. Het heeft betrekking op de hele set van Unicode. ASCII is gecodeerd als een enkele byte per karakter en andere tekens nemen meer bytes, afhankelijk van hun exacte codepunt (maximaal 4 bytes voor alle momenteel gedefinieerde codepunten, dat wil zeggen tot U-0010FFFF, en inderdaad kunnen 4 bytes tot stand brengen U-001FFFFFF).

Wanneer “Unicode” wordt gebruikt als de naam van een tekencodering (bijvoorbeeld als de .NET codering.unicode onroerend goed) Het betekent meestal utf- 16 , die codeert voor de meest voorkomende personages als twee bytes. Sommige platforms (met name .NET en Java) gebruiken UTF-16 als hun “native” karaktercodering. Dit leidt tot harige problemen als u zich zorgen maakt over karakters die niet kunnen worden gecodeerd in een enkele UTF-16-waarde (ze zijn gecodeerd als “surrogate pairs”) – maar de meeste ontwikkelaars maken zich hier nooit zorgen over, IME.

Enkele referenties op Unicode:


4, Autoriteit 20%

Ze zijn niet hetzelfde – UTF-8 is een bepaalde manier om Unicode te coderen.

Er zijn veel verschillende coderingen die u kunt kiezen, afhankelijk van uw aanvraag en de gegevens die u van plan bent te gebruiken. De meest voorkomende zijn UTF-8, UTF-16 en UTF-32 S ver als ik weet.


5, Autoriteit 14%

Unicode definieert alleen -codepunten , dat wil zeggen een getal dat een karakter vertegenwoordigt. Hoe u deze codepunten in het geheugen opslaat, hangt af van de -codering die u gebruikt. UTF-8 is een manier om unicode-tekens te coderen, onder vele anderen.


6, Autoriteit 7%

Unicode is een standaard die, samen met ISO / IEC 10646, Universal Character Set (UCS) is, die een superset is van alle bestaande personages die nodig zijn om praktisch alles te vertegenwoordigen bekende talen.

Unicode wijst een naam en een cijfer (-araktercode of Code-punt ) toe aan elk teken in zijn repertoire.

UTF-8-codering , is een manier om deze tekens digitaal in computergeheugen weer te geven. UTF-8 kaarten per code-punt in een reeks van octetten (8-bits bytes)

voor b.g.,

UCS-personage = Unicode HAN karakter

UCS CODE-PUNT = U + 24B62

UTF-8-codering = F0 A4 AD A2 (HEX) = 11110000 10100100 10101101 10100010 (BIN)


7, Autoriteit 4%

Unicode is slechts een standaard die een tekenset (UCS ) en coderingen (UTF ) om deze tekenset te coderen. Maar in het algemeen wordt Unicode verwijst naar de tekenset en niet de standaard.

Lees Het absolute minimum dat elke softwareontwikkelaar absoluut, positief moet weten over Unicode en tekensets (geen excuses !)en Unicode in 5 minuten.


Antwoord 8, autoriteit 4%

De bestaande antwoorden leggen al veel details uit, maar hier is een heel kort antwoord met de meest directe uitleg en voorbeeld.

Unicode is de standaarddie tekens toewijst aan codepunten.
Elk karakter heeft een uniek codepunt (identificatienummer), een nummer zoals 9731.

UTF-8 is een decoderingvan de codepunten.
Om alle tekens op schijf (in een bestand) op te slaan, splitst UTF-8 tekens in maximaal 4 octetten (8-bits reeksen) – bytes.
UTF-8 is een van de vele coderingen (methoden om gegevens weer te geven). In Unicode staat het (decimale) codepunt 9731 bijvoorbeeld voor een sneeuwpop (), die in UTF-8 uit 3 bytes bestaat: E2 98 83

Hier is een gesorteerde lijst met enkele willekeurige voorbeelden.


Antwoord 9, autoriteit 3%

UTF-8is een mogelijk coderingsschema voor Unicode-tekst.

Unicodeis een brede standaard die meer dan 140.000 tekens definieert en aan elk een numerieke code (een codepunt) toewijst. Het definieert ook regels voor het sorteren van deze tekst, het normaliseren, het wijzigen van hoofdletters en meer. Een teken in Unicode wordt weergegeven door een codepunt van nul tot en met 0x10FFFF, hoewel sommige codepunten zijn gereserveerd en niet voor tekens kunnen worden gebruikt.

Er is meer dan één manier waarop een reeks Unicode-codepunten kan worden gecodeerd in een binaire stroom. Dit worden “coderingen” genoemd. De meest eenvoudige codering is UTF-32, die elk codepunt eenvoudigweg opslaat als een 32-bits geheel getal, met elk een breedte van 4 bytes. Aangezien codepunten slechts tot 0x10FFFF gaan (vereist 21 bits), is deze codering enigszins verspillend.

UTF-8is een andere codering en wordt de de-facto standaard, vanwege een aantal voordelen ten opzichte van UTF-32 en andere. UTF-8 codeert elk codepunt als een reeks van 1, 2, 3 of 4 bytewaarden. Codepunten in het ASCII-bereik worden gecodeerd als een enkele bytewaarde, om compatibel te zijn met ASCII. Codepunten buiten dit bereik gebruiken elk 2, 3 of 4 bytes, afhankelijk van het bereik waarin ze zich bevinden.

UTF-8 is ontworpen met de volgende eigenschappen in gedachten:

  • ASCII-tekens worden precies zo gecodeerd als in ASCII, zodat een ASCII-tekenreeks ook een geldige UTF-8-tekenreeks is die dezelfde tekens vertegenwoordigt.

  • Efficiënter: tekenreeksen in UTF-8 nemen bijna altijd minder ruimte in beslag dan dezelfde tekenreeksen in UTF-32 of UTF-16, op enkele uitzonderingen na.

  • Binaire sortering: het sorteren van UTF-8-tekenreeksen met binaire sortering resulteert er nog steeds in dat alle codepunten in numerieke volgorde worden gesorteerd.

  • Als een codepunt meerdere bytes gebruikt, bevat geen van die bytes waarden in het ASCII-bereik, zodat geen enkel deel ervan kan worden aangezien voor een ASCII-teken. Dit is ook een beveiligingsfunctie.

  • UTF-8 kan eenvoudig worden gevalideerd en door een validator worden onderscheiden van andere tekencoderingen. Tekst in andere 8-bits of multi-byte-coderingen wordt zeer zelden ook als UTF-8 gevalideerd vanwege de zeer specifieke structuur van UTF-8.

  • Willekeurige toegang: op elk punt in een UTF-8-string is het mogelijk om te vertellen of de byte in die positie de eerste byte van een personage is of niet, en om het begin van het volgende of huidige karakter te vinden en niet te vinden , zonder dat u naar voren of achterwaarts meer dan 3 bytes hoeft te hoeven te scannen of om te weten hoe ver in de reeks waarvan we zijn begonnen met lezen.


10, Autoriteit 3%

1. Unicode

Er zijn veel personages over de hele wereld, zoals “$, & amp;, h, a, t,?, 张, 1, =, + …”.

Dan komt er een organisatie die is toegewijd aan deze personages,

Ze hebben een standaard genaamd “Unicode”.

De standaard is als volgt:

  • Maak een formulier waarin elke positie “CODE PUNT” of “CODE POSITION” wordt genoemd.
  • De volledige posities zijn van U + 0000 naar U + 10FFFF;
  • Tot nu toe zijn sommige posities gevuld met tekens en worden andere posities opgeslagen of leeg.
  • Bijvoorbeeld, de positie “U + 0024” is gevuld met het teken “$”.

PS: Natuurlijk is er een andere organisatie genaamd ISO die een andere standaard behoudt – “ISO 10646”, bijna hetzelfde.

2. UTF-8

Zoals hierboven is U + 0024 slechts een positie, dus we kunnen “U + 0024” niet opslaan op de computer voor het teken “$”.

Er moet een coderingsmethode zijn.

Kom dan coderende methoden, zoals UTF-8, UTF-16, UTF-32, UCS-2 ….

Onder UTF-8 wordt het codepunt “U + 0024” gecodeerd in 00100100.

00100100 is de waarde die we opslaan in de computer voor “$”.


11, Autoriteit 2%

Ik heb de links in het antwoord van Gumbo gecontroleerd en ik wilde een deel van die dingen hier op Stack & Nbsp; Overflow ook.

“…Sommige mensen hebben de misvatting dat Unicode gewoon een 16-bits code is waarbij elk teken 16 bits in beslag neemt en daarom zijn er 65.536 mogelijke tekens. Dit is eigenlijk niet juist. Het is de meest voorkomende mythe over Unicode, dus als je dat dacht, voel je dan niet slecht.

In feite heeft Unicode een andere manier van denken over karakters, en je moet de Unicode manier van denken over dingen begrijpen, anders klopt er niets.

Tot nu toe hebben we aangenomen dat een letter verwijst naar een aantal bits die u op schijf of in het geheugen kunt opslaan:

Een -> 0100 0001

In Unicode verwijst een letter naar iets dat een codepunt wordt genoemd, wat nog steeds slechts een theoretisch concept is. Hoe dat codepunt wordt weergegeven in het geheugen of op schijf is een heel ander verhaal…”

“…Elke platonische letter in elk alfabet krijgt een magisch getal toegewezen door het Unicode-consortium dat als volgt is geschreven: U+0639. Dit magische getal wordt een codepunt genoemd. De U+ betekent “Unicode” en de cijfers zijn hexadecimaal. U+0639 is de Arabische letter Ain. De Engelse letter A is U+0041……”

“…OK, dus stel dat we een string hebben:

Hallo

wat in Unicode overeenkomt met deze vijf codepunten:

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

Alleen een aantal codepunten. Cijfers, echt. We hebben nog niets gezegd over hoe je dit in het geheugen kunt opslaan of weergeven in een e-mailbericht…”

“…Dat is waar coderingen van pas komen.

Het vroegste idee voor Unicode-codering, dat leidde tot de mythe over de twee bytes, was: laten we die getallen gewoon in twee bytes opslaan. Dus Hallowordt

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

Toch? Niet zo snel! Zou het ook niet kunnen zijn:

48 00 65 00 6C 00 6C 00 6F 00 ? …”


Antwoord 12

UTF-8is een methode voor het coderen van Unicode-tekens met behulp van 8-bits reeksen.

Unicodeis een standaard voor het weergeven van een grote verscheidenheid aan tekens uit vele talen.

Other episodes