Chinese, Japanse en Koreaanse talen. Eenheden voor het meten van gegevensvolume en geheugencapaciteit: kilobytes, megabytes, gigabytes ...

(En het gaat niet om de grootte)

Elliot Rusty Harold
Gepubliceerd 25.09.2013

Sitemapservice Google veroorzaakte onlangs een beetje opschudding in de XML-gemeenschap, omdat het begon te vereisen dat alle sitemaps exclusief in UTF-8 Unicode werden gepubliceerd. Google staat zelfs geen alternatieve Unicode-coderingen (zoals UTF-16) toe, laat staan ​​niet-Unicode-coderingen zoals ISO-8859-1. Vanuit technisch oogpunt betekent dit dat Google een of andere niet-standaard-compatibele XML-parser gebruikt, zoals de XML-aanbeveling zegt: "Alle XML-processors MOETEN UTF-8- en UTF-16 Unicode 3.1-coderingen accepteren". Is dit echter echt zo'n probleem?

UTF-8 is voor iedereen beschikbaar

Veelzijdigheid is de eerste en meest dwingende reden om voor UTF-8 te kiezen. Deze codering kan werken met zowat elk schrijfsysteem dat tegenwoordig wordt gebruikt. Er zijn nog enkele hiaten, maar die worden steeds zeldzamer en worden opgevuld. De meeste schrijfsystemen die onbedekt blijven, zijn ook niet geïmplementeerd in een andere tekenset, en zelfs als ze dat wel waren, zijn ze niet beschikbaar in XML. V beste geval ze worden geïmplementeerd door lettertype-hacks die zijn gebouwd op single-byte tekensets zoals Latin-1. Echte steun voor zulke zeldzame systemen letters verschijnen eerst in Unicode (en waarschijnlijk uitsluitend in Unicode en nergens anders).

Dit is echter slechts een van de argumenten ten gunste van Unicode. Waarom kiezen voor UTF-8 boven UTF-16 of andere Unicode-coderingen? Een van de meest voor de hand liggende redenen is de brede steun voor: gereedschap... Bijna elke opmerkelijke editor die met XML kan worden gebruikt, werkt in UTF-8, inclusief JEdit, BBEdit, Eclipse, emacs en zelfs Windows Kladblok(Kladblok). Geen enkele andere Unicode-codering kan bogen op zo'n brede ondersteuning van tooling onder XML- en niet-XML-hulpprogramma's.

In sommige gevallen (zoals BBEdit en Eclipse) is UTF-8 niet de standaardtekenset. Het is tijd om de standaardinstellingen te wijzigen - alle tools moeten worden geleverd met UTF-8 als standaardcodering. Totdat dat gebeurt, zitten we vast in een moeras van functioneel incompatibele bestanden die beschadigd raken wanneer ze worden overgedragen over landsgrenzen, platformgrenzen en taalgrenzen heen. Maar totdat alle programma's UTF-8 als standaardcodering hebben, kunt u de standaardinstellingen eenvoudig zelf wijzigen. In Eclipse kunt u bijvoorbeeld in het paneel Algemeen / Editors getoond in Afbeelding 1 specificeren dat alle bestanden UTF-8-gecodeerd moeten zijn. Het is u misschien opgevallen dat Eclipse een standaard MacRoman-installatie "wil"; als dit echter is toegestaan, worden uw bestanden niet gecompileerd wanneer ze worden doorgegeven aan programmeurs die werken op computers met operating Microsoft-systeem® Windows® en alle computers buiten Amerika en West-Europa.

Afbeelding 1. De standaardtekenset in Eclipse wijzigen

Om UTF-8 te laten werken, moeten de ontwikkelaars met wie u bestanden uitwisselt natuurlijk ook UTF-8 gebruiken; maar dat zou geen probleem moeten zijn. In tegenstelling tot MacRoman is UTF-8 niet beperkt tot slechts een paar schrijfsystemen en een ongewoon platform. UTF-8 werkt voor iedereen goed. De situatie is compleet anders met MacRoman, Latin-1, SJIS en verschillende andere traditionele nationale karaktersets.

UTF-8 werkt ook beter met tools die niet verwachten multibyte-gegevens te ontvangen. Andere Unicode-indelingen (zoals UTF-16) bevatten meestal talrijke null-bytes. Veel tools interpreteren deze bytes als een einde van het bestand of een ander speciaal scheidingsteken, met onverwachte, onvoorziene en vaak onaangename gevolgen. Als UTF-16-gegevens bijvoorbeeld "op ingenieuze wijze" in een C-tekenreeks worden geladen, kan de tekenreeks worden afgekapt bij de tweede byte van het eerste ASCII-teken. UTF-8-bestanden bevatten alleen nullen, die eigenlijk nullen zouden moeten zijn. Deze eenvoudigere tools voor het verwerken van XML-documenten moet u natuurlijk niet kiezen. Documenten komen echter vaak op zulke ongebruikelijke plekken in traditionele systemen terecht, waar niemand echt rekening mee hield en de gevolgen niet begreep van "nieuwe wijn in oude zakken gieten". Systemen die niet bekend zijn met Unicode en XML hebben minder kans op problemen met UTF-8 dan met UTF-16 of andere Unicode-coderingen.

Wat de specificaties zeggen

XML was de eerste belangrijke standaard die UTF-8 volledig ondersteunde, maar dat was nog maar het begin van een trend. Normalisatie-instanties bevelen steeds vaker UTF-8 aan. URL's die niet-ASCII-tekens bevatten, lange tijd een hardnekkig probleem op het internet. Een URL die werd uitgevoerd op een pc die niet-ASCII-tekens bevatte, weigerde te werken bij het laden op Mac-platform en vice versa. Dit probleem is pas onlangs opgelost toen het Consortium Wereldwijd Het Web (W3C) en de Internet Engineering Task Force (IETF) zijn overeengekomen dat alle URL's alleen worden gecodeerd in UTF-8 en geen andere codering.

Beide organisaties (W3C en IETF) in recente tijden zijn onvermurwbaarder geworden over het kiezen van UTF-8 in het algemeen en soms als de enige codering. In document Het W3C-personagemodel voor de wereld Wijde web 1.0: Grondbeginselen("The W3C Character Model for the World Wide Web 1.0: The Basics") stelt: "Als een ondubbelzinnige tekencodering vereist is, MOET de tekencodering UTF-8, UTF-16 of UTF-32 zijn. De US-ASCII-codering is opwaarts compatibel met UTF-8 (een US-ASCII-string is ook een UTF-8-string, zie), dus UTF-8 kan worden gebruikt als compatibiliteit met US-ASCII vereist is." In de praktijk is US-ASCII-compatibiliteit zo handig dat het bijna een vereiste is. Het W3C legt wijselijk uit: “In andere situaties, zoals voor API's, kan UTF-16 of UTF-32 geschikter zijn. Mogelijke redenen keuzes van een van deze coderingen omvatten interne verwerkingsefficiëntie en interoperabiliteit met andere processen. "

Ik kan het argument over de effectiviteit van interne verwerking geloven. Bijvoorbeeld de interne representatie van strings Java-taal™ is gebaseerd op UTF-16, wat het indexeren in een string aanzienlijk versnelt. maar Java-code onthult nooit zijn interne representatie aan de programma's waarmee het communiceert. In plaats daarvan wordt java.io.Writer gebruikt voor externe communicatie en wordt de tekenset expliciet gespecificeerd. Bij het maken van deze keuze wordt UTF-8 sterk aanbevolen.

De IETF-vereisten zijn zelfs nog explicieter. In document Het IETF-tekensetbeleid(Het IETF-tekensetbeleid) vermeldt expliciet:

Protocollen MOETEN de UTF-8-tekenset voor alle tekst kunnen gebruiken, die bestaat uit de ISO 10646-gecodeerde tekenset in combinatie met het UTF-8-tekencoderingsschema dat is gedefinieerd in bijlage R (gepubliceerd in amendement 2).

Protocollen KUNNEN bovendien specificeren hoe andere tekensets of andere tekencoderingsschema's voor ISO 10646 moeten worden gebruikt, zoals UTF-16, maar het niet kunnen gebruiken van UTF-8 is een schending van dit beleid; een dergelijke overtreding zou een soort afwijzingsprocedure vereisen (clausule 9) met een duidelijke en dwingende rechtvaardiging in het protocolspecificatiedocument voordat het normpad wordt betreden of bewandeld.

Voor bestaande protocollen en protocollen die gegevens uit bestaande informatiearchieven verplaatsen, kan een vereiste zijn om andere tekensets te ondersteunen of zelfs een andere standaardcodering dan UTF-8 te gebruiken. Dit is acceptabel, maar UTF-8-ondersteuning MOET aanwezig zijn.

Sleutelmoment: ondersteuning voor traditionele protocollen en bestanden kan het enige tijd nodig hebben om niet-UTF-8-tekensets en -coderingen te accepteren - ik zou echter op mijn strot trappen eigen liedje als ik dit zou moeten doen. Elk nieuw protocol, elke nieuwe toepassing en elke nieuw document moet UTF-8 gebruiken.

Chinese, Japanse en Koreaanse talen

Een veel voorkomende misvatting is dat UTF-8 een compressieformaat zou moeten zijn. Dit is fundamenteel verkeerd. Tekens in het ASCII-bereik beslaan slechts de helft van de ruimte in UTF-8 die ze innemen in sommige andere Unicode-coderingen, met name in UTF-16. Sommige symbolen vereisen echter tot 50% meer ruimte voor UTF-8-codering - vooral Chinese, Japanse en Koreaanse (CJK) tekens.

Maar zelfs wanneer u CJK XML naar UTF-8 codeert, zal de werkelijke groottetoename ten opzichte van UTF-16 waarschijnlijk niet zo significant zijn. Bijvoorbeeld een XML-document op Chinese bevat veel ASCII-tekens zoals:<, >, &, =, ",", en een spatie. Al deze karakters nemen minder ruimte in beslag in UTF-8 dan in UTF-16. De exacte hoeveelheid compressie of expansie zal van document tot document verschillen, maar in ieder geval is het onwaarschijnlijk dat het verschil erg merkbaar zal zijn.

Ten slotte is het vermeldenswaard dat ideografische scripts zoals Chinees en Japans de neiging hebben om "zuinig" te zijn in termen van het aantal karakters in vergelijking met alfabetische scripts zoals Latijn en Cyrillisch. Sommige grote absolute aantallen van deze karakters vereisen drie of meer bytes per karakter om deze schrijfsystemen volledig weer te geven; dit betekent dat dezelfde woorden en zinnen kunnen worden uitgedrukt met minder karakters dan talen als Engels en Russisch. Het Japanse ideogram voor een boom is bijvoorbeeld 木. (Het lijkt een beetje op een boom). Dit ideogram is drie bytes in UTF-8, terwijl het Engelse woord "tree" vier letters lang is en vier bytes in beslag neemt. Het Japanse ideogram voor een bosje is æž- (twee bomen naast elkaar). Het duurt ook drie bytes in UTF-8, terwijl het Engelse woord "grove" vijf letters lang is en vijf bytes in beslag neemt. Het Japanse ideogram æ £ ® (drie bomen) duurt nog steeds maar drie bytes. En het equivalente Engelse woord "forest" duurt zes.

Als u echt geïnteresseerd bent in compressie, comprimeer dan de XML met behulp van de zip- of gzip-hulpprogramma's. Gecomprimeerde UTF-8 heeft waarschijnlijk dezelfde grootte als gecomprimeerde UTF-16, ongeacht het aanvankelijke verschil in grootte. aanvankelijk grotere maat een van de documenten wordt gecompenseerd door de grotere redundantie die door het compressie-algoritme wordt geëlimineerd.

Betrouwbaarheid

Het echte hoogtepunt is dat, door de bedoeling van het ontwerp, UTF-8 een veel betrouwbaarder en gemakkelijker te interpreteren formaat is dan enige andere tekstcodering die voor en na UTF-8 is ontwikkeld. Ten eerste heeft UTF-8, in tegenstelling tot UTF-16, geen problemen met de bytevolgorde. Big endian en big endian UTF-8 zijn identiek omdat UTF-8 is gedefinieerd in 8-bits bytes en niet in 16-bits woorden. UTF-8 heeft geen bytevolgorde-ambiguïteit die zou moeten worden opgelost met bytevolgordemarkeringen of andere heuristieken.

Nog meer belangrijk kenmerk UTF-8 hoeft geen status vast te leggen. Elke byte van een UTF-8-stream of -reeks is uniek. In UTF-8 weet je altijd waar je bent - dat wil zeggen, door een enkele byte kun je onmiddellijk bepalen of het een single-byte-teken is, de eerste byte van een dubbel-byte-teken, de tweede byte van een dubbel-byte-teken. byte-teken, of de tweede, derde of vierde byte van een teken van drie of vier bytes ... (Dit zijn niet alle mogelijkheden, maar de verstrekte informatie zal u helpen om algemeen idee). In UTF-16 weet u niet altijd of de byte "0x41" de letter "A" vertegenwoordigt. Soms wel, en soms niet. U moet de status voldoende bijhouden om te weten waar u zich in de stream bevindt. Als een enkele byte verloren gaat, zijn alle daaropvolgende gegevens vanaf dat punt beschadigd. In UTF-8 worden verloren of beschadigde bytes onmiddellijk gedetecteerd zonder schade aan de rest van de gegevens te veroorzaken.

UTF-8 is niet ideaal voor alle toepassingen. Toepassingen die willekeurige toegang tot specifieke indices in een document vereisen, kunnen sneller werken bij gebruik van een soort codering met vaste breedte, zoals UCS2 of UTF-32. (UTF-16 is een codering met variabele breedte als rekening wordt gehouden met vervangende paren.) XML-verwerking is echter niet relevant voor dergelijke toepassingen. De XML-specificatie vereist eigenlijk dat parsers beginnen met parseren bij de eerste byte XML-document en ging door met ontleden tot het einde, en alle bestaande parsers werken precies op die manier. Het versnellen van willekeurige toegang zou de XML-verwerking op geen enkele manier helpen; daarom, hoewel dit een goede reden zou kunnen zijn om een ​​andere codering in een database of ander systeem te gebruiken, is het geen XML.

Conclusie

In een steeds internationaler wordende wereld, waarin taalkundige en politieke grenzen elke dag vager worden, worden lokaal specifieke karaktersets onbruikbaar. Unicode is de enige tekenset die in alle landen ter wereld kan worden gebruikt. UTF-8 is een goede Unicode-implementatie die:

  • biedt brede tooling-ondersteuning, inclusief de beste compatibiliteit met oudere ASCII-systemen;
  • eenvoudig en efficiënt te hanteren;
  • bestand tegen datacorruptie;
  • is platformonafhankelijk.

Het is tijd om het debat over karakterset en codering te beëindigen - kies UTF-8 en beëindig het debat.

In theorie is er al lang een oplossing voor deze problemen. Het heet Unicode Unicode Is een coderingstabel waarin 2 bytes worden gebruikt om elk teken te coderen, d.w.z. 16 bits. Op basis van een dergelijke tabel kunnen N = 2 16 = 65 536 tekens worden gecodeerd.

Unicode bevat bijna alle moderne scripts, waaronder: Arabisch, Armeens, Bengaals, Birmaans, Grieks, Georgisch, Devanagari, Hebreeuws, Cyrillisch, Koptisch, Khmer, Latijn, Tamil, Hangul, Han (China, Japan, Korea), Cherokee, Ethiopisch, Japans (Katakana, Hiragana, Kanji) en anderen.

Voor academische doeleinden zijn er veel historische schriften toegevoegd, waaronder: Oudgrieks, Egyptische hiërogliefen, spijkerschrift, Maya-schrift, Etruskisch alfabet.

Unicode biedt een breed scala aan wiskundige en muzikale symbolen en pictogrammen.

Er zijn twee codebereiken voor Cyrillische tekens in Unicode:

Cyrillisch (# 0400 - # 04FF)

Cyrillisch supplement (# 0500 - # 052F).

Maar tafelinjectie Unicode in zijn pure vorm wordt het tegengehouden omdat als de code van één teken niet één byte, maar twee bytes in beslag neemt, het twee keer zoveel zal kosten om de tekst op te slaan schijfruimte, en voor de overdracht via communicatiekanalen - twee keer zo lang.

Daarom komt in de praktijk tegenwoordig de Unicode-weergave van UTF-8 (Unicode Transformation Format) vaker voor. UTF-8 biedt de beste compatibiliteit met systemen die 8-bits tekens gebruiken. Tekst die alleen tekens bevat die minder dan 128 zijn genummerd, wordt geconverteerd naar gewone ASCII-tekst wanneer deze in UTF-8 wordt geschreven. De rest van de Unicode-tekens wordt weergegeven door reeksen van 2 tot 4 bytes lang. Aangezien de meest voorkomende tekens ter wereld - de tekens van het Latijnse alfabet - in UTF-8 nog steeds 1 byte innemen, is deze codering in het algemeen voordeliger dan pure Unicode.

    in de gecodeerde Engelse tekst slechts 26 letters van het Latijnse alfabet en nog 6 leestekens worden gebruikt. In dit geval kan gegarandeerd worden dat tekst met 1000 tekens wordt gecomprimeerd zonder verlies van informatie tot de grootte:

    Ellochka's woordenboek - "de kannibaal" (een personage in de roman "The Twelve Chairs") is 30 woorden. Hoeveel bits zijn genoeg om het geheel te coderen? woordenschat Ellochki? Opties: 8, 5, 3, 1.

    1. Eenheden voor het meten van gegevensvolume en geheugencapaciteit: kilobytes, megabytes, gigabytes ...

Dus, in we ontdekten dat in de meeste moderne coderingen Er wordt 1 byte toegewezen voor het opslaan van één teken van de tekst op elektronische media. Die. in bytes wordt het volume (V) dat wordt ingenomen door gegevens gemeten tijdens hun opslag en verzending (bestanden, berichten).

Gegevensvolume (V) - het aantal bytes dat nodig is om ze op te slaan in het geheugen van een elektronische gegevensdrager.

Het opslagmedium heeft op zijn beurt een beperkte capaciteit, d.w.z. het vermogen om een ​​bepaald volume te bevatten. Geheugencapaciteit elektronische media informatie wordt natuurlijk ook gemeten in bytes.

Een byte is echter een kleine maateenheid voor de hoeveelheid gegevens, de grotere zijn kilobytes, megabytes, gigabytes, terabytes ...

Houd er rekening mee dat de voorvoegsels "kilo", "mega", "giga" ... niet in . zijn in dit geval decimale. Dus "kilo" in het woord "kilobyte" betekent niet "duizend", d.w.z. betekent niet “10 3”. Een bit is een binaire eenheid en daarom is het in de informatica handig om meeteenheden te gebruiken die veelvouden zijn van het getal "2" in plaats van het getal "10".

1 byte = 2 3 = 8 bits, 1 kilobyte = 2 10 = 1024 bytes. V binair 1 kilobyte = & 1.000.000.000 bytes.

Die. "Kilo" geeft hier het getal aan dat het dichtst bij duizend ligt, wat een macht is van het getal 2, d.w.z. wat een "rond" getal is in binair systeem afrekening.

Tabel 10.

naamgeving

Aanwijzing

Waarde in bytes

kilobyte

megabyte

2 10 Kb = 2 20 b

gigabyte

2 10 Mb = 2 30 b

terabyte

2 10 Gb = 2 40 b

1.099 511 627 776 b

Vanwege het feit dat de meeteenheden voor volume en capaciteit informatiedragers zijn veelvouden van 2 en geen veelvouden van 10, de meeste problemen over dit onderwerp zijn gemakkelijker op te lossen wanneer de waarden die erin verschijnen worden weergegeven door machten van 2. Overweeg een voorbeeld van een soortgelijk probleem en de oplossing ervan:

Het tekstbestand bevat 400 pagina's tekst. Elke pagina bevat 3200 tekens. Als de codering KOI-8 is (8 bits per teken), dan is de bestandsgrootte:

Oplossing

    Bepaal het totale aantal tekens in het tekstbestand. In dit geval stellen we getallen die veelvouden zijn van een macht van 2 voor als een macht van 2, d.w.z. in plaats van 4 schrijven we 2 2, enz. Tabel 7 kan worden gebruikt om de graad te bepalen.

karakters.

2) Door de toestand van het probleem neemt 1 teken 8 bits in beslag, d.w.z. 1 byte => bestand neemt 2 7 * 10000 bytes in beslag.

3) 1 kilobyte = 2 10 bytes => bestandsgrootte in kilobytes is:

.

    Hoeveel bits zitten er in een kilobyte?

    &10000000000000.

    Waar is 1 MB gelijk aan?

    1024 bytes;

    1024 kilobyte;

  • 1.000.000 bytes.

    Hoeveel bits zitten er in een bericht van een kwart kilobyte? Opties: 250, 512, 2000, 2048.

    Volume tekstbestand 640 Kb... Het bestand bevat een boek dat gemiddeld wordt getypt in 32 regels per pagina en per 64 teken in de tekenreeks. Hoeveel pagina's bevat het boek: 160, 320, 540, 640, 1280?

    Dossier over werknemers 8 Mb... Elk van hen bevat 16 Pagina's ( 32 regels door 64 karakter per regel). Hoeveel medewerkers in de organisatie: 256; 512; 1024; 2048?

Dit bericht is voor degenen die niet begrijpen wat UTF-8 is, maar het wel willen begrijpen, en de beschikbare documentatie behandelt dit probleem vaak zeer uitgebreid. Ik zal het hier proberen te beschrijven op de manier waarop ik zelf zou willen dat iemand me dat eerder zou vertellen. Omdat ik vaak een puinhoop in mijn hoofd had over UTF-8.

Een paar simpele regels

  1. Dus UTF-8 is een wrapper rond Unicode. Het is geen aparte tekencodering, het is verpakt in Unicode. U kent waarschijnlijk de Base64-codering, of hebt er wel eens van gehoord - het kan binaire gegevens in afdrukbare tekens verpakken. Duck, UTF-8 is dezelfde Base64 voor Unicode als Base64 voor binaire gegevens. Deze keer. Als je dit begrijpt, wordt er al veel duidelijk. En het wordt ook, net als Base64, erkend om het compatibiliteitsprobleem in tekens op te lossen (Base64 is uitgevonden voor e-mail, om bestanden per post over te dragen, waarin alle tekens kunnen worden afgedrukt)
  2. Verder, als de code werkt met UTF-8, dan werkt het intern nog steeds met Unicode-coderingen, dat wil zeggen, ergens diep van binnen zijn er tabellen met symbolen van exact Unicode-tekens. Het is waar dat je misschien geen Unicode-tekentabellen hebt als je bijvoorbeeld alleen maar wilt tellen hoeveel tekens er in een regel staan ​​(zie hieronder)
  3. UTF-8 is gemaakt met het doel dat oude programma's en hedendaagse computers normaal kunnen werken met Unicode-tekens, zoals met oude coderingen, zoals KOI8, Windows-1251, enz. In UTF-8 zijn er geen bytes met nullen, alle bytes zijn ze zijn ofwel van 0x01 - 0x7F, zoals normale ASCII, of 0x80 - 0xFF, wat ook werkt voor programma's die in C zijn geschreven, zoals het zou werken met niet-ASCII-tekens. waar, voor correct werk met symbolen moet het programma Unicode-tabellen kennen.
  4. Alles met de meest significante 7e bit in een byte (bits tellend vanaf nul) UTF-8 maakt deel uit van de Unicode-codestroom.

UTF-8 van binnen naar buiten

Als je het bitsysteem kent, dan is dit voor jou snel bericht hoe is UTF-8 gecodeerd:

De eerste Unicode-byte van een UTF-8-teken begint met een byte, waarbij de 7e bit altijd één is en de 6e bit altijd één. In dit geval, in de eerste byte, als je naar de bits van links naar rechts kijkt (7e, 6e enzovoort tot nul), zijn er evenveel eenheden als bytes, inclusief de eerste, om één Unicode-teken te coderen. De reeks enen eindigt op een nul. En daarna zijn de bits van het Unicode-teken zelf. De rest van de Unicode-bits van het teken vallen in de tweede of zelfs de derde bytes (maximaal drie, waarom - zie hieronder). De rest van de bytes, behalve de eerste, hebben altijd het begin '10' en dan 6 bits van het volgende deel van het Unicode-teken.

Voorbeeld

Bijvoorbeeld: er zijn bytes 110 10000 en de tweede 10 011110 ... De eerste begint met '110', wat betekent dat als er twee zijn, er twee bytes van de UTF-8-stream zijn, en de tweede byte, net als alle andere, begint met '10'. En deze twee bytes coderen het Unicode-teken, dat bestaat uit 10100 bits van het eerste stuk + 101101 van het tweede, zo blijkt -> 10000011110 -> 41E in hexadecimaal systeem, of U + 041E schriftelijk Unicode-notaties. Dit is het symbool van de grote Russische O.

Hoeveel bytes per karakter is het maximum?

Laten we ook eens kijken hoeveel bytes er maximaal in UTF-8 gaan om de 16 bits van de Unicode-codering te coderen. De tweede en verdere bytes kunnen altijd maximaal 6 bits bevatten. Dus als we beginnen met de trailing bytes, dan gaan er precies twee bytes weg (2e en derde), en de eerste moet beginnen met '1110' om er drie te coderen. Dit betekent dat de eerste byte in dit geval de eerste 4 bits van een Unicode-teken kan coderen. Het blijkt 4 + 6 + 6 = 16 byte. Het blijkt dat UTF-8 2 of 3 bytes per Unicode-teken kan hebben (dat kan niet, aangezien het niet nodig is om 6 bits (8 - 2 bits '10') te coderen - ze zullen ASCII-teken... Dit is de reden waarom de eerste byte van UTF-8 nooit met '10' kan beginnen).

Conclusie

Trouwens, dankzij deze codering kun je elke byte in de stream nemen en bepalen of de byte een Unicode-teken is (als de 7e bit geen ASCII is), zo ja, is dit de eerste in de UTF-8-stream of niet de eerste (als '10' niet de eerste betekent), zo niet de eerste, dan kunnen we byte teruggaan om de eerste UTF-8-code te vinden (waarvan de 6e bit 1 is), of naar rechts gaan en sla alle '10' bytes over om het volgende teken te vinden. Dankzij deze codering kunnen programma's ook, zonder Unicode te kennen, uitlezen hoeveel karakters er in een string zitten (gebaseerd op de eerste UTF-8 byte, bereken de karakterlengte in bytes). Over het algemeen, als je erover nadenkt, is de UTF-8-codering zeer competent en tegelijkertijd zeer efficiënt uitgevonden.

Unicode ondersteunt bijna alle bestaande tekensets. De beste vorm De codering van de Unicode-tekenset is UTF-8-codering. Het implementeert ASCII-compatibiliteit, resistentie tegen gegevenscorruptie, efficiëntie en verwerkingsgemak. Maar eerst dingen eerst.

Coderingsformulieren

Computers werken op getallen niet alleen als abstracte wiskundige objecten, maar als combinaties van eenheden voor het opslaan en verwerken van informatie. vaste maat- bytes en 32-bits woorden. De coderingsstandaard dient hiermee rekening te houden bij het bepalen van de presentatiemethode.

V computersystemen gehele getallen worden opgeslagen in geheugenlocaties van 8 bits (1 byte), 16 of 32 bits. Elke vorm van Unicode-codering bepaalt welke reeks geheugenlocaties het gehele getal vertegenwoordigt dat overeenkomt met een bepaald teken. De standaard presenteert drie verschillende vormen Unicode-tekencodering: 8, 16 en 32-bits blokken. Dienovereenkomstig worden ze UTF-8, UTF-16 en UTF-32 genoemd. De naam UTF staat voor Unicode Transformation Format. Elk van de drie vormen van codering is een gelijke manier om Unicode-tekens weer te geven, heeft voordelen in: verschillende gebieden sollicitatie.

Deze coderingen kunnen worden gebruikt om alle Unicode-tekens weer te geven. Ze zijn dus volledig compatibel voor oplossingen, volgens: verschillende redenen verschillende vormen van coderen gebruiken. Elke codering kan ondubbelzinnig worden geconverteerd naar een van de andere twee zonder gegevensverlies.

Principe van niet-overlapping

Elke vorm van Unicode-codering is ontworpen met overlap in het achterhoofd. Windows-932 genereert bijvoorbeeld tekens uit een of twee bytes aan code. De lengte van de reeks is afhankelijk van de eerste byte, dus de waarden van de leidende byte in de reeks van twee bytes en een enkele byte overlappen elkaar niet. De waarden van de enkele byte en de volgbyte van de reeks kunnen echter hetzelfde zijn. Dit betekent bijvoorbeeld dat u bij het zoeken naar het teken D (code 44) dit ten onrechte kunt vinden in het tweede deel van de reeks van twee bytes van het teken "D" (code 84 44). Om erachter te komen welke volgorde correct is, moet het programma rekening houden met de vorige bytes.

De situatie wordt ingewikkelder als de voorloop- en volgbytes hetzelfde zijn. Dit betekent dat om dubbelzinnigheid weg te nemen, er omgekeerd wordt gezocht totdat het begin van de tekst of een eenduidige codereeks is bereikt. Dit is niet alleen ineffectief, maar ook niet immuun voor: mogelijke fouten, omdat één verkeerde byte voldoende is om de hele tekst onleesbaar te maken.

Het Unicode-conversieformaat vermijdt dit probleem omdat de waarden van de voorloop-, volg- en enkele opslageenheid niet overeenkomen. Hierdoor zijn alle Unicode-coderingen geschikt om te zoeken en te vergelijken en geven ze nooit een foutief resultaat door een match. verschillende delen tekencode. Het feit dat deze coderingsvormen voldoen aan het principe van niet-overlap, onderscheidt ze van andere multibyte Oost-Aziatische coderingen.

Een ander aspect van non-intersection is dat elk karakter goed gedefinieerde grenzen heeft. Dit elimineert de noodzaak om een ​​ongedefinieerd aantal voorgaande karakters te scannen. Deze functie coderingen worden soms zelfsynchronisatie genoemd. Vervorming van één code-eenheid resulteert in vervorming van slechts één teken en de omringende tekens blijven intact. Als de aanwijzer in 8-bits conversie-indeling verwijst naar een byte die begint met 10xxxxxx (in binaire codering), duurt het één tot drie sprongen achteruit om het begin van een teken te vinden.

Samenhang

Het Unicode Consortium ondersteunt alle 3 vormen van coderingen volledig. Het is belangrijk om geen bezwaar te maken tegen UTF-8 en Unicode, omdat alle conversieformaten even legitieme incarnaties zijn van Unicode-tekencoderingsvormen.

Byte-oriëntatie

Om een ​​UTF-32-teken weer te geven, hebt u één 32-bits code-eenheid nodig, die hetzelfde is als de Unicode-code. UTF-16 - Een tot twee 16-bits eenheden. En UTF-8 gebruikt tot 4 bytes.

UTF-8-codering is ontworpen voor compatibiliteit met byte-georiënteerde systemen op ASCII-gebaseerd. de meeste van bestaande software en praktijk informatie technologieën lange tijd vertrouwden op de representatie van karakters als een reeks bytes. Veel protocollen zijn afhankelijk van onveranderlijkheid en gebruiken of vermijden speciale controletekens. Op een eenvoudige manier U kunt Unicode aan dergelijke situaties aanpassen door 8-bits codering toe te passen om Unicode-tekens weer te geven die gelijk zijn aan elk teken of besturingsteken. Dit is waar UTF-8-codering voor is.

Variabele lengte

UTF-8 - codering variabele lengte, bestaande uit 8-bits informatie-opslageenheden, waarvan de meest significante bits aangeven tot welk deel van de reeks elke afzonderlijke byte behoort. Een reeks waarden is gereserveerd voor het eerste element van de codereeks, de andere voor de volgende. Dit zorgt ervoor dat de codering niet kruisend is.

ASCII

UTF-8-codering wordt volledig ondersteund ASCII-codes(0x00-0x7F). Dit betekent dat de Unicode-tekens U + 0000-U + 007F worden geconverteerd naar een enkele byte 0x00-0x7F UTF-8 en dus niet meer te onderscheiden zijn van ASCII. Bovendien worden, om dubbelzinnigheid te voorkomen, de waarden 0x00-0x7F in geen enkele andere Unicode-byte gebruikt. Een reeks van twee bytes wordt gebruikt om niet-ideografische niet-ASCII-tekens te coderen. Tekens van het bereik U + 0800-U + FFFF worden weergegeven door drie bytes, en extra tekens met codes groter dan U + FFFF vereisen vier bytes.

Toepassingsgebied

UTF-8 heeft meestal de voorkeur boven HTML en dergelijke.

XML werd de eerste standaard met volledige ondersteuning UTF-8-coderingen. Normenorganisaties bevelen het ook aan. Ondersteuningsprobleem in URL's niet-ASCII-tekens werden opgelost toen het W3C-consortium en de IETF-engineeringgroep overeenkwamen om alles exclusief in UTF-8 te coderen.

ASCII-compatibiliteit maakt het gemakkelijk om over te stappen software... De meeste teksteditors werken met UTF-8, inclusief JEdit, Emacs, BBEdit, Eclipse en Notepad besturingssysteem Ramen. Geen enkele andere vorm van Unicode-codering kan bogen op een dergelijke tooling-ondersteuning.

Het voordeel van codering is dat het uit een reeks bytes bestaat. UTF-8-strings zijn gemakkelijk om mee te werken in C en andere programmeertalen. Het is de enige vorm van codering waarvoor geen stuklijst of coderingsdeclaratie in XML vereist is.

Zelfsynchronisatie

In een omgeving die 8-bits tekenverwerking gebruikt, heeft UTF-8 de volgende voordelen ten opzichte van andere multibytecoderingen:

  • De eerste byte van de codereeks bevat informatie over de lengte ervan. Dit verbetert de efficiëntie van het direct zoeken.
  • Het vinden van het begin van een teken is vereenvoudigd omdat de startbyte beperkt is tot een vast waardenbereik.
  • Er is geen snijpunt van bytewaarden.

Vergelijking van voordelen

UTF-8-codering is compact. Maar wanneer toegepast, worden reeksen van 3 bytes gebruikt om Oost-Aziatische karakters te coderen (Chinees, Japans, Koreaans, met Chinese karakters). Ook is UTF-8-codering inferieur aan andere vormen van codering in termen van verwerkingssnelheid. En binaire sortering van strings geeft hetzelfde resultaat als binaire sortering van Unicode.

Tekencoderingsschema

Een tekencoderingsschema bestaat uit een tekencoderingsvorm en een bytegewijze rangschikking van code-eenheden. Om het coderingsschema te definiëren, voorziet de Unicode-standaard in het gebruik van een Byte Order Mark (BOM).

Door de stuklijst op te nemen in UTF-8, is de labelfunctie beperkt tot alleen aangeven dat de coderingsvorm moet worden gebruikt. UTF-8 heeft geen probleem met het bepalen van de bytevolgorde, aangezien de grootte van de codeereenheid gelijk is aan één byte. Het gebruik van de stuklijst voor deze vorm van codering is niet vereist en ook niet aanbevolen. De stuklijst kan voorkomen in tekst die is geconverteerd vanuit andere coderingen die een stuklijst gebruiken, of voor een UTF-8-coderingshandtekening. Het is een reeks van 3 bytes EF 16 BB 16 BF 16.

Hoe u UTF-8-codering instelt?

In UTF-8 is het geïnstalleerd met de volgende code:

˂meta http-equiv = "Content-Type" content = "text / html; charset = utf-8" ˃

V PHP-codering UTF-8 wordt ingesteld met behulp van de functie header () helemaal aan het begin van het bestand na het instellen van de waarde voor het uitvoerniveau van de fout:

error_reporting (-1);

Tekenset = utf-8 ");

Om verbinding te maken met bases MySQL-gegevens UTF-8-codering is als volgt ingesteld:

mysql_set_charset ("utf8");

In CSS-bestanden wordt UTF-8-tekencodering als volgt gespecificeerd:

@charset "utf-8";

Bij het opslaan van alle soorten bestanden is UTF-8-codering zonder stuklijst geselecteerd, anders werkt de site niet. Om dit te doen, selecteert u in het DreamWeave-programma het menu-item "Modificaties - Pagina-eigenschappen - Titel / codering", wijzigt u de codering in UTF-8. Vervolgens moet u de pagina opnieuw laden, het vinkje weghalen bij "Connect Unicode Signatures (BOM)" en de wijzigingen toepassen. Als tekst op de pagina of in de database is ingevoerd door een andere vorm van codering, moet deze opnieuw worden ingevoerd of opnieuw worden gecodeerd. Bij het werken met normale uitdrukkingen zorg ervoor dat u de u-modifier gebruikt.

In tekst Kladblok-editor++, als de codering afwijkt van UTF-8, gebruik dan het menu-item "Converteren naar UTF-8 zonder stuklijst" om de codering te wijzigen en op te slaan in UTF-8-codering.

Er is geen alternatief

In de context van globalisering, wanneer politieke en taalkundige grenzen worden gewist, worden karaktersets met lokale kenmerken van weinig nut. Unicode is de enige tekenset met ondersteuning voor alle lokalisaties. En UTF-8 is een voorbeeld van een correcte Unicode-implementatie die:

  • Ondersteunt een breed scala aan tools, waaronder ASCII-compatibiliteit;
  • is bestand tegen datacorruptie;
  • eenvoudig en effectief in verwerking;
  • platformonafhankelijk.

Met de komst van UTF-8 zijn discussies over welke vorm van codering of tekenset het beste is, zinloos geworden.