Eenheden van datavolume en geheugencapaciteit: kilobytes, megabytes, gigabytes…. Een paar simpele regels

(En het gaat niet om de grootte)

Elliot Rusty Harold
Gepubliceerd op 25-09-2013

Sitemap-service Googlen heeft onlangs voor wat opschudding gezorgd in de XML-gemeenschap toen het begon te eisen dat alle sitemaps exclusief in UTF-8 Unicode werden gepubliceerd. Google staat niet eens toe dat je alternatieven gebruikt Unicode-coderingen(bijv. UTF-16), om nog maar te zwijgen van niet-Unicode-coderingen zoals ISO-8859-1. In technische termen betekent dit dat Google een soort XML-parser gebruikt die niet aan de standaarden voldoet, aangezien de XML-aanbeveling stelt dat "alle XML-processors UTF-8 en UTF-16 Unicode 3.1-coderingen MOETEN 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 vrijwel elk schrijfsysteem dat tegenwoordig wordt gebruikt. Er blijven nog enkele hiaten bestaan, maar deze worden steeds zeldzamer en worden momenteel opgevuld. De schrijfsystemen die ongedekt blijven, zijn voor het grootste deel ook in geen enkele andere karakterset geïmplementeerd, en zelfs als ze wel geïmplementeerd zijn, zijn ze niet beschikbaar in XML. IN beste scenario ze worden geïmplementeerd door lettertype-hacks die zijn gebouwd bovenop tekensets van één byte, zoals Latin-1. Echte steun voor hen zeldzame systemen letters verschijnen eerst in Unicode (en waarschijnlijk uitsluitend in Unicode en nergens anders).

Dit is echter slechts een van de argumenten vóór 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 hulpmiddelen. Bijna elke belangrijke editor die met XML kan worden gebruikt, werkt met UTF-8, inclusief JEdit, BBEdit, Eclipse, emacs en zelfs Windows Kladblok(Kladblok). Geen enkele andere Unicode-codering beschikt over zo'n uitgebreide toolondersteuning tussen XML- en niet-XML-hulpprogramma's.

In sommige gevallen (zoals BBEdit en Eclipse) is UTF-8 niet de standaardtekenset. Het is tijd om de standaardcodering te wijzigen: alle tools zouden met UTF-8 als standaardcodering moeten worden geleverd. Totdat dat gebeurt, zullen we in een moeras van functioneel incompatibele bestanden blijven zitten die beschadigd raken tijdens het transport over nationale, platform- en taalgrenzen heen. Totdat alle programma's echter UTF-8 als standaardcodering hebben, kunt u de standaardinstellingen eenvoudig zelf wijzigen. In Eclipse kunt u bijvoorbeeld in het paneel Algemeen/Editors, weergegeven in Figuur 1, opgeven dat alle bestanden UTF-8-gecodeerd moeten zijn. Het zal je misschien opvallen dat Eclipse MacRoman standaard "wil" geïnstalleerd hebben; Als u dit echter toestaat, worden uw bestanden niet gecompileerd wanneer ze worden verzonden naar programmeurs waarop computers actief zijn Microsoft-systeem® Windows® en alle computers buiten Amerika en West-Europa.

Figuur 1. De standaardtekenset in Eclipse wijzigen

Om UTF-8 te laten werken, moeten de ontwikkelaars met wie u bestanden deelt uiteraard ook UTF-8 gebruiken; maar dit zou geen probleem moeten zijn. In tegenstelling tot MacRoman is UTF-8 niet beperkt tot slechts een paar schrijfsystemen en één minder gebruikt platform. UTF-8 werkt goed voor iedereen. De situatie is compleet anders bij MacRoman, Latin-1, SJIS en andere verschillende traditionele nationale tekensets.

UTF-8 werkt ook beter met tools die geen multibyte-gegevens verwachten. Andere Unicode-formaten (zoals UTF-16) bevatten doorgaans talloze null-bytes. Veel tools interpreteren deze bytes als het einde van het bestand of een ander speciaal scheidingsteken, wat tot onverwachte, onvoorziene en vaak onaangename gevolgen leidt. Als UTF-16-gegevens bijvoorbeeld "gewoon" 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 moeten zijn. Dergelijke eenvoudige hulpmiddelen voor het verwerken van XML-documenten moet u natuurlijk niet kiezen. Documenten komen echter vaak op ongebruikelijke plaatsen in traditionele systemen terecht, waar niemand echt heeft nagedacht of begrepen wat de gevolgen zijn van 'het gieten van nieuwe wijn in oude wijnzakken'. Op systemen die niet bekend zijn met Unicode en XML is de kans kleiner dat er problemen optreden bij het gebruik van UTF-8 dan bij het werken met UTF-16 of andere Unicode-coderingen.

Wat de specificaties zeggen

XML was de eerste grote standaard die UTF-8 volledig ondersteunde, maar het was nog maar het begin van een trend. Standaardisatie-instellingen bevelen steeds vaker UTF-8 aan. Bijvoorbeeld URL's die niet-ASCII-tekens bevatten voor een lange tijd zijn een hardnekkig probleem op internet. Een URL die op een pc werd uitgevoerd en die niet-ASCII-tekens bevatte, weigerde te werken wanneer deze werd geladen Mac-platform en omgekeerd. Dit probleem werd pas onlangs opgelost door het World Consortium Breed web(W3C) en de Internet Engineering Task Force (IETF) zijn overeengekomen dat alle URL's alleen in UTF-8 zullen worden gecodeerd en geen andere codering.

Beide organisaties (W3C en IETF) de laatste tijd zijn onvermurwbaarder geworden in het kiezen van UTF-8 in het algemeen, en soms als de enige codering. In het document Het W3C-karaktermodel voor de wereld Wide Web 1.0: grondbeginselen("W3C-karaktermodel voor Wereldwijd Web 1.0: Basics" stelt: "Wanneer ondubbelzinnige tekencodering vereist is, MOET de tekencodering UTF-8, UTF-16 of UTF-32 worden gebruikt. 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 US-ASCII-compatibiliteit nodig is." In de praktijk is US-ASCII-compatibiliteit zo nuttig dat het praktisch een vereiste is. Het W3C legt wijselijk uit: “In andere situaties, zoals bij API’s, kan UTF-16 of UTF-32 geschikter zijn. Mogelijke redenen de keuze voor een van deze coderingen impliceert interne verwerkingsefficiëntie en interoperabiliteit met andere processen."

Ik kan het argument over de effectiviteit van interne verwerking kopen. Bijvoorbeeld de interne representatie van strings Java-taal™ is gebaseerd op UTF-16, wat het indexeren in een string enorm versnelt. Echter Java-code toont nooit zijn interne representatie aan 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 sterk aangeraden om UTF-8 te gebruiken.

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

Protocollen MOETEN voor alle tekst de UTF-8-tekenset kunnen gebruiken, die bestaat uit de ISO 10646-gecodeerde tekenset gecombineerd met het UTF-8-tekencoderingsschema 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 gebruiken van UTF-8 is een overtreding van dit beleid; een dergelijke overtreding zou een vorm van afwijkingsprocedure vereisen (sectie 9) met duidelijke en dwingende rechtvaardiging in het protocolspecificatiedocument voordat het standaardpad wordt betreden of verder wordt gegaan.

Voor bestaande protocollen en protocollen die gegevens uit bestaande gegevensopslagplaatsen verplaatsen, kan een vereiste zijn dat andere tekensets worden ondersteund of zelfs een andere standaardcodering dan UTF-8 wordt gebruikt. Dit is acceptabel, maar de mogelijkheid om UTF-8 te ondersteunen MOET aanwezig zijn.

Sleutelpunt: ondersteuning voor traditionele protocollen en bestanden vereist mogelijk nog enige tijd de adoptie van andere tekensets en coderingen dan UTF-8 - ik zou echter op de keel trappen eigen liedje als ik dit moest 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 is. Dit is fundamenteel verkeerd. Tekens in het ASCII-bereik nemen in UTF-8 slechts de helft van de ruimte in beslag die ze innemen in sommige andere Unicode-coderingen, met name UTF-16. Sommige symbolen vereisen echter tot 50% meer ruimte voor UTF-8-codering - vooral Chinese, Japanse en Koreaanse (CJK) tekens.

Maar zelfs als je XML CJK naar UTF-8 codeert, zal de werkelijke toename in grootte ten opzichte van UTF-16 waarschijnlijk niet zo groot zijn. Een XML-document op bijvoorbeeld 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 mate van compressie- of expansieverhouding varieert van document tot document, maar het verschil zal in ieder geval waarschijnlijk niet erg merkbaar zijn.

Ten slotte is het de moeite waard om op te merken dat ideografische schriften zoals het Chinees en het Japans over het algemeen 'economisch' zijn in termen van het aantal karakters vergeleken met alfabetische schriften zoals het Latijn en het Cyrillisch. Voor sommige grote absolute aantallen van deze karakters zijn drie of meer bytes per karakter nodig om de gespecificeerde schrijfsystemen volledig weer te geven; dit betekent dat dezelfde woorden en zinnen met minder karakters kunnen worden uitgedrukt dan in talen als Engels en Russisch. Het Japanse ideogram voor boom is bijvoorbeeld æ¨. (Het lijkt een beetje op hout). Dit ideogram beslaat drie bytes in UTF-8, terwijl het Engelse woord ‘tree’ uit vier letters bestaat en vier bytes beslaat. Het Japanse ideogram voor een bosje is æ- (twee bomen naast elkaar). Het neemt ook drie bytes in beslag in UTF-8, terwijl het Engelse woord "grove" uit vijf letters bestaat en vijf bytes in beslag neemt. Het Japanse ideogram 森 (drie bomen) is nog steeds slechts drie bytes. En voor het equivalente Engelse woord 'bos' zijn er zes nodig.

Als je echt geïnteresseerd bent in compressie, comprimeer dan XML met behulp van de zip- of gzip-hulpprogramma's. Gecomprimeerde UTF-8 zal waarschijnlijk qua grootte dicht bij gecomprimeerde UTF-16 liggen, ongeacht het aanvankelijke verschil in grootte. Aanvankelijk groter formaat een van de documenten wordt gecompenseerd door een grotere redundantie, die wordt geëlimineerd door het compressie-algoritme.

Betrouwbaarheid

Het echte voordeel is dat UTF-8 door zijn ontwerp een veel betrouwbaarder en gemakkelijker te interpreteren formaat is dan welke andere tekstcodering dan ook die vóór of na UTF-8 is ontwikkeld. Ten eerste kent UTF-8, in tegenstelling tot UTF-16, geen problemen met endianness. Little-endian en little-endian UTF-8 zijn identiek omdat UTF-8 is gedefinieerd in 8-bits bytes in plaats van 16-bits woorden. UTF-8 kent geen dubbelzinnigheid in de bytevolgorde die zou moeten worden opgelost met behulp van bytevolgordemarkeringen of andere heuristieken.

Nog meer belangrijk kenmerk UTF-8 is staatloos. Elke byte van een UTF-8-stream of -reeks is uniek. In UTF-8 weet u altijd waar u zich bevindt - dat wil zeggen dat u aan één byte onmiddellijk kunt zien of het een enkel-byte-teken is, de eerste byte van een dubbel-byte-teken, de tweede byte van een dubbel-byte-teken teken, of de tweede, derde of vierde byte van een teken van drie of vier bytes. (Dit zijn zeker niet alle mogelijkheden, maar de verstrekte informatie zal u helpen deze te vinden algemeen idee). In UTF-16 weet je niet altijd of de byte "0x41" de letter "A" vertegenwoordigt. Soms is dit waar, en soms ook niet. U moet voldoende statusregistratie hebben om te weten waar u zich in de stroom bevindt. Als een enkele byte verloren gaat, zijn alle daaropvolgende gegevens vanaf dat moment beschadigd. In UTF-8 worden verloren of beschadigde bytes onmiddellijk gedetecteerd en beschadigen ze geen andere gegevens.

UTF-8-codering is niet ideaal voor alle toepassingen. Toepassingen die willekeurige toegang tot specifieke indexen binnen een document vereisen, presteren mogelijk sneller bij gebruik van codering met een vaste breedte, zoals UCS2 of UTF-32. (UTF-16 is een codering met variabele breedte wanneer rekening wordt gehouden met vervangingsparen). XML-verwerking is echter niet een van die toepassingen. De XML-specificatie vereist feitelijk dat parsers beginnen met parseren bij de eerste byte XML-document en zette de analyse tot het einde voort, en alle bestaande parsers werken op deze manier. Het versnellen van willekeurige toegang zou de XML-verwerking op geen enkele manier bevorderen; Dus hoewel dit een goede reden kan zijn om een ​​andere codering in een database of ander systeem te gebruiken, is dit niet relevant voor XML.

Conclusie

In een steeds meer geïnternationaliseerde wereld, waarin taalkundige en politieke grenzen elke dag steeds vager worden, worden lokale karaktersets onbruikbaar. Unicode is de enige tekenset die op alle locaties ter wereld kan worden gebruikt. UTF-8 is een goede Unicode-implementatie die:

  • beschikt over brede toolondersteuning, inclusief de beste compatibiliteit met traditionele ASCII-systemen;
  • eenvoudig en effectief te verwerken;
  • bestand tegen datacorruptie;
  • is platformonafhankelijk.

Het is tijd om te stoppen met discussiëren over tekensets en coderingen - kies UTF-8 en beëindig het debat.

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

Een paar simpele regels

  1. UTF-8 is dus een wrapper voor Unicode. Dit is geen afzonderlijke tekencodering, het is een "verpakte" Unicode. U kent of heeft waarschijnlijk gehoord van Base64-codering: het kan binaire gegevens in afdrukbare tekens verpakken. Welnu, UTF-8 is dezelfde Base64 voor Unicode als Base64 voor binaire gegevens. Deze keer. Als je dit begrijpt, wordt er veel duidelijk. En er wordt aangenomen dat het, net als Base64, het probleem van de compatibiliteit van karakters oplost (Base64 is uitgevonden voor e-mail, om bestanden per post over te dragen, waarin alle karakters kunnen worden afgedrukt)
  2. Verder, als de code werkt met UTF-8, dan werkt deze binnenin nog steeds met Unicode-coderingen, dat wil zeggen dat er ergens diep van binnen tekentabellen zijn met precies Unicode-tekens. Het is waar dat je misschien geen Unicode-tekentabellen hebt als je bijvoorbeeld alleen maar hoeft te tellen hoeveel tekens er op 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 dat zijn ofwel van 0x01 - 0x7F, zoals gewone ASCII, of 0x80 - 0xFF, wat ook werkt onder programma's die in C zijn geschreven, net zoals het zou werken met niet-ASCII-tekens. Klopt, voor correcte werking met symbolen moet het programma Unicode-tabellen kennen.
  4. Alles dat een 7e meest significante bit in een byte heeft (bits tellen vanaf 0) UTF-8 maakt deel uit van de Unicode-gecodeerde stroom.

UTF-8 van binnenuit

Als je het bitsysteem kent, dan hier korte herinnering als UTF-8 gecodeerd:

De eerste byte van een Unicode-teken in UTF-8 begint met een byte waarbij het 7e bit altijd een één is, en het 6e bit altijd een één. Bovendien zijn er in de eerste byte, als je de bits van links naar rechts bekijkt (7e, 6e enzovoort tot nul), evenveel eenheden als het aantal bytes, inclusief de eerste, dat wordt gebruikt om één Unicode-teken te coderen. De reeks enen eindigt met een nul. En daarna komen de stukjes van het Unicode-teken zelf. De overige bits van het Unicode-teken vallen in de tweede of zelfs derde bytes (maximaal drie, zie waarom - zie hieronder). De overige bytes, behalve de eerste, beginnen altijd met '10' en vervolgens met 6 bits van het volgende deel van het Unicode-teken.

Voorbeeld

Er zijn bijvoorbeeld bytes 110 10000 en ten tweede 10 011110 . De eerste begint met '110' - dit betekent dat twee keer één - er twee bytes van de UTF-8-stream zullen zijn, en de tweede byte begint, net als alle andere, met '10'. En deze twee bytes coderen een Unicode-teken, dat bestaat uit 10100 bits van het eerste stuk + 101101 van het tweede, zo blijkt -> 10000011110 -> 41E in hexadecimaal, of U+041E bij het schrijven van Unicode-notaties. Dit is het symbool van de grote Russische O.

Wat is het maximale byte per teken?

Laten we ook eens kijken hoeveel bytes er in UTF-8 nodig zijn om 16 bits Unicode-codering te coderen. De tweede en verdere bytes kunnen altijd maximaal 6 bits bevatten. Dit betekent dat als je begint met de laatste bytes, er precies twee bytes zullen gaan (de 2e en de derde), en de eerste moet beginnen met ‘1110’ om er drie te kunnen coderen. Dit betekent dat de eerste byte in deze versie maximaal 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, omdat het niet nodig is om 6 bits te coderen (8 - 2 bits '10') - dat zullen ze wel doen ASCII-teken. Dit is de reden waarom de eerste byte van UTF-8 nooit kan beginnen met '10').

Conclusie

Dankzij deze codering kun je trouwens elke byte in de stream nemen en bepalen of de byte een Unicode-teken is (als de 7e bit niet ASCII betekent), en zo ja, of het de eerste in de UTF-8-stream is of niet de eerste (als '10' niet de eerste betekent), zo niet de eerste, dan kunnen we bytebyte achteruit gaan om de eerste UTF-8-code te vinden (die een 1 in de 6e bit heeft), of naar rechts en sla alle '10' bytes over om het volgende symbool te vinden. Dankzij deze codering kunnen programma's, zonder Unicode te kennen, ook tellen hoeveel tekens er op een regel staan ​​(bereken op basis van de eerste UTF-8-byte de lengte van het teken in bytes). Als je erover nadenkt, is de UTF-8-codering over het algemeen zeer vakkundig en tegelijkertijd zeer effectief uitgevonden.

Theoretisch gezien bestaat er al lang een oplossing voor deze problemen. Het heet Unicode (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 veel historische scripts toegevoegd, waaronder: oud-Grieks, Egyptische hiërogliefen, spijkerschrift, Maya-schrift en het Etruskische 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 is beperkt omdat als de code van één teken niet één byte, maar twee bytes in beslag neemt, het twee keer zoveel zal duren om de tekst op te slaan schijfruimte

Daarom komt in de praktijk de Unicode-weergave UTF-8 (Unicode Transformation Format) vaker voor. UTF-8 biedt de beste compatibiliteit met systemen die 8-bits tekens gebruiken. Tekst die alleen bestaat uit tekens met een nummer kleiner dan 128, wordt geconverteerd naar gewone ASCII-tekst wanneer deze in UTF-8 wordt geschreven. Andere Unicode-tekens worden weergegeven als reeksen van 2 tot 4 bytes lang. Omdat de meest voorkomende tekens ter wereld, het Latijnse alfabet, nog steeds 1 byte in UTF-8 beslaan, is deze codering over het algemeen zuiniger dan pure Unicode.

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

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

    1. Eenheden van datavolume en geheugencapaciteit: kilobytes, megabytes, gigabytes...

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

Het datavolume (V) is het aantal bytes dat nodig is om ze op te slaan in het geheugen van een elektronisch opslagmedium.

Het mediageheugen is op zijn beurt beperkt capaciteit, d.w.z. het vermogen om een ​​bepaald volume te bevatten. Elektronische geheugencapaciteit opslagmedia, wordt uiteraard ook gemeten in bytes.

Een byte is echter een kleine eenheid van datavolume; grotere zijn kilobyte, megabyte, gigabyte, terabyte...

Houd er rekening mee dat de voorvoegsels “kilo”, “mega”, “giga”... er niet in staan 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 om deze reden is het in de informatica handig om eenheden te gebruiken die een veelvoud zijn van het getal “2” in plaats van het getal “10”.

1byte = 2 3 =8 bits, 1 kilobyte = 2 10 = 1024 bytes. IN binair 1 kilobyte = &10000000000 bytes.

Die. “kilo” duidt hier het getal aan dat het dichtst bij duizend ligt, wat ook een macht van 2 is, d.w.z. wat een “rond” getal is binair systeem Afrekening.

Tabel 10.

Naamgeving

Aanduiding

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 van het volume en de capaciteit van informatieopslagmedia deelbaar zijn door 2 en niet deelbaar door 10, zijn de meeste problemen over dit onderwerp gemakkelijker op te lossen wanneer de waarden die daarin voorkomen, worden weergegeven door machten van 2. Beschouw een voorbeeld van een dergelijk probleem en de oplossing ervan:

Het tekstbestand bevat 400 pagina's tekst.

Elke pagina bevat 3200 tekens.

    Als KOI-8-codering wordt gebruikt (8 bits per teken), is de bestandsgrootte:

Oplossing

Bepaal het totale aantal tekens in een tekstbestand.

In dit geval vertegenwoordigen we getallen die veelvouden zijn van machten van 2 als machten van 2, d.w.z. schrijf in plaats van 4 2 2, enz. Voor het bepalen van de graad kan gebruik worden gemaakt van tabel 7.

.

    karakters.

    &10000000000000.

    2) Volgens de omstandigheden van het probleem beslaat 1 teken 8 bits, 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 één kilobyte?

  • Waar is 1 MB gelijk aan?

    1024 bytes; 1024 kilobytes;

    1000000 bytes. Hoeveel bits zitten er in een bericht van een kwart kilobyte? Opties: 250, 512, 2000, 2048. Volume 32 tekstbestand 64 640 KB

    . Het bestand bevat een boek dat gemiddeld is getypt lijnen op de pagina en door teken in een lijn. Hoeveel pagina's bevat het boek: 160, 320, 540, 640, 1280? 16 Er worden personeelsdossiers bijgehouden 32 8 Mb 64 .

Elk van hen bevat pagina's ( lijnen door

teken op een regel).

Hoeveel medewerkers zijn er in de organisatie: 256; 512; 1024; 2048? Unicode ondersteunt vrijwel alle bestaande tekensets. Beste vorm

IN De codering van de Unicode-tekenset is UTF-8. Het beschikt over ASCII-compatibiliteit, weerstand tegen corruptie, efficiëntie en verwerkingsgemak. Maar eerst dingen eerst. Coderingsformulieren Computers werken niet alleen met getallen als abstracte wiskundige objecten, maar als combinaties van eenheden voor opslag en verwerking van informatie 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 Transform Format. Elk van de drie vormen van codering is een gelijkwaardige manier om Unicode-tekens weer te geven en heeft voordelen verschillende gebieden toepassingen.

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

Niet-overlappend principe

Elke vorm van Unicode-codering is ontworpen om overlap te voorkomen. Windows-932 vormt bijvoorbeeld tekens uit één of twee bytes code. De lengte van de reeks is afhankelijk van de eerste byte, dus de waarden van de leidende byte in een reeks van twee bytes en een enkele byte overlappen elkaar niet. De betekenis van de enkele byte en de volgende byte 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 reeks correct is, moet het programma rekening houden met de voorgaande bytes.

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

Het Unicode-conversieformaat vermijdt dit probleem omdat de waarden voor de voorloop-, volg- en enkele opslageenheid niet hetzelfde zijn. Dit maakt alle Unicode-coderingen geschikt voor zoeken en vergelijken, en levert nooit een foutief resultaat op vanwege een match verschillende onderdelen tekencode. Het feit dat deze coderingsvormen het principe van niet-overlap respecteren, onderscheidt ze van andere multi-byte Oost-Aziatische coderingen.

Een ander aspect van niet-overlapping is dat elk personage duidelijk gedefinieerde grenzen heeft. Dit elimineert de noodzaak om een ​​onbepaald aantal voorgaande tekens te scannen. Deze functie coderingen worden soms zelfsynchronisatie genoemd. Het corrumperen van één code-eenheid zal slechts één teken corrumperen, waardoor de omliggende symbolen onaangeroerd blijven. Als de aanwijzer in een 8-bits conversieformaat verwijst naar een byte die begint met 10xxxxxx (in binair getal), zijn er één tot drie backtraces nodig om het begin van het teken te vinden.

Samenhang

Het Unicode Consortium ondersteunt alle drie de vormen van coderingen volledig. Het is belangrijk om UTF-8 niet tegenover Unicode te stellen, omdat alle conversieformaten even legitieme implementaties zijn van de Unicode-standaardtekencoderingsvormen.

Byte-oriëntatie

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

UTF-8-codering is ontworpen voor compatibiliteit met byte-georiënteerde systemen. ASCII-gebaseerd. Meest bestaande software en praktijk informatietechnologie lange tijd vertrouwd op het weergeven van karakters als een reeks bytes. Veel protocollen zijn afhankelijk van onveranderlijkheid en gebruiken of vermijden speciale controletekens. Op een eenvoudige manier Unicode kan aan dergelijke situaties worden aangepast door 8-bits codering te gebruiken om Unicode-tekens weer te geven die gelijkwaardig zijn aan alle controletekens. Dit is waar UTF-8-codering voor is ontworpen.

Variabele lengte

UTF-8-codering variabele lengte, bestaande uit 8-bits informatieopslageenheden, waarvan de meest significante bits aangeven tot welk deel van de reeks elke individuele byte behoort. Het ene bereik van waarden is gereserveerd voor het eerste element van de codereeks, het andere voor de daaropvolgende. Dit zorgt ervoor dat de codering niet overlapt.

ASCII

UTF-8-codering wordt volledig ondersteund ASCII-codes(0x00-0x7F). Dit betekent dat Unicode-tekens U+0000-U+007F worden omgezet in een enkele byte 0x00-0x7F UTF-8 en dus niet meer te onderscheiden zijn van ASCII. Om dubbelzinnigheid te voorkomen, worden de waarden 0x00-0x7F bovendien in geen enkele byte van de Unicode-tekenrepresentatie meer gebruikt. Om andere niet-ideografische tekens dan ASCII te coderen, wordt een reeks van twee bytes gebruikt. Tekens in 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-codering heeft meestal de voorkeur in HTML en soortgelijke protocollen.

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

ASCII-compatibiliteit maakt de overgang eenvoudig software. De meeste teksteditors werken met UTF-8, waaronder JEdit, Emacs, BBEdit, Eclipse en Notepad. besturingssysteem Ramen. Geen enkele andere vorm van Unicode-codering kan bogen op dergelijke toolondersteuning.

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

Zelfsynchronisatie

In een omgeving die 8-bit tekenverwerking gebruikt, vergeleken met andere multibyte-coderingen, heeft UTF-8 de volgende voordelen:

  • De eerste byte van de codereeks bevat informatie over de lengte ervan. Dit verbetert de efficiëntie van directe zoekopdrachten.
  • Het vinden van het begin van een teken is eenvoudiger omdat de startbyte beperkt is tot een vast bereik van waarden.
  • Er is geen snijpunt van bytewaarden.

Vergelijking van voordelen

UTF-8-codering is compact. Maar wanneer het wordt gebruikt voor het coderen van Oost-Aziatische karakters (Chinees, Japans, Koreaans, waarbij Chinese karakters worden gebruikt), worden reeksen van 3 bytes gebruikt. Ook is UTF-8-codering inferieur aan andere vormen van codering in termen van verwerkingssnelheid. En het binair sorteren van tekenreeksen levert hetzelfde resultaat op als het binair sorteren van Unicode.

Karaktercoderingsschema

Een tekencoderingsschema bestaat uit een vorm van tekencodering en een byte-voor-byte opstelling van code-eenheden. Om een ​​coderingsschema te definiëren, gebruikt de Unicode-standaard een leading byte order mark (BOM).

Door BOM in UTF-8 in te schakelen, wordt de functie van het label beperkt tot het alleen aangeven van de te gebruiken coderingsvorm. UTF-8 heeft geen problemen met het bepalen van de bytevolgorde, aangezien de coderingseenheid één byte groot is. Het gebruik van BOM voor deze vorm van coderen is niet vereist en ook niet aanbevolen. BOM kan voorkomen in teksten die zijn geconverteerd vanuit andere coderingen die een bytevolgordemarkering gebruiken, of voor een UTF-8-coderingshandtekening. Vertegenwoordigt een reeks van 3 bytes EF 16 BB 16 BF 16.

UTF-8-codering instellen

Stel in op UTF-8 met behulp van de volgende code:

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

IN PHP-codering UTF-8 wordt ingesteld met behulp van de header()-functie helemaal aan het begin van het bestand na het instellen van de foutniveauwaarde:

foutrapportage(-1);

Tekenset=utf-8");

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

mysql_set_charset("utf8");

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

@tekenset "utf-8";

Bij het opslaan van alle typen bestanden wordt de UTF-8-codering zonder BOM geselecteerd, anders werkt de site niet. Om dit te doen, moet u in het DreamWeave-programma het menu-item "Wijzigingen - Pagina-eigenschappen - Header/codering" selecteren en de codering wijzigen in UTF-8. Vervolgens moet u de pagina opnieuw laden, het selectievakje “Enable Unicode signature (BOM)” uitschakelen en de wijzigingen toepassen. Als tekst op een pagina of in een database met een andere vorm van codering is ingevoerd, moet deze opnieuw worden ingevoerd of opnieuw worden gecodeerd. Bij het werken met reguliere expressies zorg ervoor dat u de u-modifier gebruikt.

IN teksteditor Notepad++, als de codering afwijkt van UTF-8, gebruik dan het menu-item “Converteren naar UTF-8 zonder BOM” om de codering te wijzigen en op te slaan in UTF-8-codering.

Er is geen alternatief

In de context van de mondialisering, wanneer politieke en taalkundige grenzen worden uitgewist, worden karaktersets met lokale kenmerken van weinig nut. Unicode is de enige tekenset die alle landinstellingen ondersteunt. En UTF-8 is een voorbeeld van een correcte implementatie van Unicode, die:

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

Met de komst van UTF-8 zijn discussies over welke coderingsvorm of karakterset beter is, zinloos geworden.