Unicode-codering. Unicode: standaard voor tekencodering

Unicode

Materiaal van Wikipedia - de gratis encyclopedie

Ga naar: navigatie, zoekopdracht

Unicode (meestal) of Unicode (Engels Unicode) - standaard tekencodering, waardoor u de tekens van bijna alle geschreven teksten kunt weergeven talen.

Standaard voorgesteld in 1991 non-profitorganisatie "Unicode Consortium" ( Engels Unicode Consortium, Unicode Inc. ). Het gebruik van deze standaard maakt het mogelijk om zeer groot aantal tekens uit verschillende scripts: Chinees kan naast elkaar bestaan ​​in Unicode-documenten hiërogliefen, wiskundige symbolen, letters Grieks alfabet, Latijns alfabet En cyrillisch alfabet, in dit geval wordt schakelen overbodig codepagina's.

De standaard bestaat uit twee hoofdonderdelen: de universele tekenset ( Engels UCS, universele tekenset) en coderingsfamilie ( Engels. UTF, Unicode-transformatieformaat). De universele tekenset specificeert één-op-één matching van karakters codes- elementen van de coderuimte die niet-negatieve gehele getallen vertegenwoordigen. Een coderingsfamilie definieert de machinerepresentatie van een reeks UCS-codes.

Codes in de Unicode-standaard zijn onderverdeeld in verschillende gebieden. De netnummers U+0000 tot U+007F bevatten kiestekens ASCII met de bijbehorende codes. Vervolgens volgen gebieden met karakters van verschillende scripts, leestekens en technische symbolen. Sommige codes zijn gereserveerd voor toekomstig gebruik. Tekengebieden met codes van U+0400 tot U+052F, van U+2DE0 tot U+2DFF, van U+A640 tot U+A69F zijn toegewezen voor Cyrillische tekens (zie. Cyrillisch in Unicode).

    1 Vereisten voor het maken en ontwikkelen van Unicode

    2 Unicode-versies

    3 Coderuimte

    4 Codeersysteem

    5 Symbolen wijzigen

    6 Vormen van normalisatie

    • 6.1 Voorbeelden

    7 Bidirectioneel schrijven

    8 Uitgelichte karakters

    9 ISO/IEC 10646

    10 Presentatiemethoden

    • 10.1 UTF-8

      10.2 Bytevolgorde

      10.3 Unicode en traditionele coderingen

      10.4 Implementaties

    11 Invoermethoden

    • 11.1 Microsoft Windows

      11.2 Macintosh-computer

      11.3 GNU/Linux

    12 Unicode-problemen

    13 "Unicode" of "Unicode"?

    14 Zie ook

Vereisten voor het maken en ontwikkelen van Unicode

Aan het eind Jaren 80 8-bits tekens werden de standaard, terwijl er veel verschillende 8-bits coderingen waren en er voortdurend nieuwe verschenen. Dit werd zowel verklaard door de voortdurende uitbreiding van het aantal ondersteunde talen, als door de wens om een ​​codering te creëren die gedeeltelijk compatibel is met andere (een typisch voorbeeld is de opkomst alternatieve codering voor de Russische taal, vanwege het gebruik van westerse programma's die zijn gemaakt voor codering CP437). Dit resulteerde in verschillende problemen:

    Probleem " krakozyabr"(documenten weergeven met onjuiste codering): het kan worden opgelost door een consistente implementatie van methoden voor het specificeren van de gebruikte codering, of door het introduceren van één enkele codering voor iedereen.

    Probleem met tekensetbeperking: dit kan worden opgelost door binnen het document van lettertype te wisselen, of door een “brede” codering te introduceren. Het wisselen van lettertypen is al lang een gewoonte tekstverwerkers en werden vaak gebruikt lettertypen met niet-standaard codering, zogenaamde "dingbat-lettertypen" - als gevolg hiervan veranderden alle niet-standaard tekens in wartaal bij het overbrengen van een document naar een ander systeem.

    Het probleem van het converteren van de ene codering naar de andere: het kan worden opgelost door conversietabellen op te stellen voor elk paar coderingen, of door een tussenconversie naar een derde codering te gebruiken die alle karakters van alle coderingen omvat.

    Het probleem van het dupliceren van lettertypen: traditioneel had elke codering zijn eigen lettertype, zelfs als deze coderingen gedeeltelijk (of volledig) samenvielen in de reeks tekens: dit probleem kon worden opgelost door “grote” lettertypen te maken, waarvan de tekens nodig waren voor een bepaalde codering werd vervolgens geselecteerd - dit vereist echter de creatie van een uniform register van symbolen om te bepalen wat met wat overeenkomt.

Het werd erkend noodzakelijke creatie een enkele “brede” codering. Coderingen met variabele lengte Tekens die veel in Oost-Azië worden gebruikt, werden als te moeilijk beschouwd om te gebruiken, daarom werd besloten tekens met een vaste breedte te gebruiken. Het gebruik van 32-bits tekens leek te verspillend, dus werd besloten om 16-bits tekens te gebruiken.

De eerste versie van Unicode was dus een vaste tekencodering van 16 bits, dus het totale aantal codes was 2 16 (65.536). Dit is waar de praktijk van het aanduiden van karakters met vier hexadecimale cijfers vandaan komt (bijvoorbeeld U+04F0). Tegelijkertijd was het de bedoeling om niet alle bestaande tekens in Unicode te coderen, maar alleen die tekens die nodig zijn voor dagelijks gebruik. Zelden gebruikte symbolen moesten in de "privégebruiksruimte" worden geplaatst, die oorspronkelijk de codes U+D800...U+F8FF bezette. Om Unicode ook als tussenschakel te kunnen gebruiken bij het naar elkaar omzetten van verschillende coderingen, bevatte het alle tekens die in de meest bekende coderingen voorkomen.

Later werd echter besloten om alle karakters te coderen en daardoor het codegebied aanzienlijk uit te breiden. Tegelijkertijd werden tekencodes niet meer gezien als 16-bits waarden, maar als abstracte getallen die in een computer konden worden weergegeven door een set verschillende manieren(cm. Presentatie methoden).

Omdat in een aantal computersystemen (bijvoorbeeld Windows NT ) vaste 16-bits tekens al als standaardcodering werden gebruikt, werd besloten om alle belangrijkste tekens alleen binnen de eerste 65.536 posities te coderen (de zogenaamde Engels eenvoudig meertalig vliegtuig, BMP). De rest van de ruimte wordt gebruikt voor "extra tekens" ( Engels aanvullend karakters): schrijfsystemen van uitgestorven of zeer zelden gebruikte talen Chinese hiërogliefen, wiskundige en muzikale symbolen.

Om compatibel te zijn met oudere 16-bits systemen, is er een systeem uitgevonden UTF-16, waarbij de eerste 65.536 posities, met uitzondering van posities in het bereik U+D800...U+DFFF, direct worden weergegeven als 16-bits getallen, en de rest wordt weergegeven als "surrogaatparen" (het eerste element van het paar uit de bereik U+D800...U+DBFF , het tweede element van het paar uit de regio U+DC00…U+DFFF). Voor surrogaatparen werd een deel van de coderuimte (2048 posities) gebruikt die voorheen gereserveerd was voor “tekens voor privégebruik”.

Omdat UTF-16 slechts 2 20 + 2 16 −2048 (1 112 064) tekens kan weergeven, werd dit getal gekozen als de uiteindelijke waarde van de Unicode-coderuimte.

Hoewel het Unicode-codegebied al in versie 2.0 werd uitgebreid tot voorbij 2 16, werden de eerste tekens in het "bovenste" gebied pas in versie 3.1 geplaatst.

De rol van deze codering in de websector groeit voortdurend; begin 2010 bedroeg het aandeel websites dat Unicode gebruikte ongeveer 50%.

Unicode-versies

Naarmate de karaktertabel van het Unicode-systeem verandert en wordt aangevuld en er nieuwe versies van dit systeem worden uitgebracht - en dit werk gaat door, aangezien het Unicode-systeem aanvankelijk alleen Plane 0 bevatte - dubbelbytecodes - worden er ook nieuwe documenten vrijgegeven ISO. Het Unicode-systeem bestaat in totaal uit de volgende versies:

    1.1 (voldoet aan de ISO/IEC 10646-1-norm: 1993 ), standaard 1991-1995.

    2.0, 2.1 (dezelfde ISO/IEC 10646-1:1993-norm plus toevoegingen: “Amendments” 1 tot 7 en “Technical Corrigenda” 1 en 2), norm uit 1996.

    3.0 (ISO/IEC 10646-1:2000-standaard), 2000-standaard.

    3.1 (normen ISO/IEC 10646-1:2000 en ISO/IEC 10646-2:2001), norm 2001.

    3.2 standaard 2002.

    4.0, standaard 2003 .

    4.01, standaard 2004 .

    4.1 standaard 2005 .

    5,0, standaard 2006 .

    5.1 standaard 2008 .

    5.2 standaard 2009 .

    6,0, standaard 2010 .

    6.1 standaard 2012 .

    6.2 standaard 2012 .

Coderuimte

Hoewel de UTF-8- en UTF-32-notaties het mogelijk maken om maximaal 2,31 (2.147.483.648) codeposities te coderen, werd besloten om slechts 1.112.064 te gebruiken voor compatibiliteit met UTF-16. Maar zelfs dit is op dit moment meer dan genoeg: versie 6.0 gebruikt iets minder dan 110.000 codeposities (109.242 grafische en 273 andere symbolen).

De coderuimte is verdeeld in 17 vliegtuigen 2 16 (65536) tekens elk. Het grondvlak wordt genoemd eenvoudig, het bevat symbolen van de meest gebruikte scripts. Het eerste vlak wordt voornamelijk gebruikt voor historische geschriften, het tweede voor zelden gebruikte hiërogliefen KKYA, de derde is gereserveerd voor archaïsche Chinese karakters . Vliegtuigen 15 en 16 zijn bestemd voor privégebruik.

Aangeven Unicode-tekens er wordt een notatie van de vorm “U+” gebruikt xxx"(voor codes 0...FFFF), of "U+ xxxxx"(voor codes 10000...FFFFF), of "U+ xxxxxx"(voor codes 100000...10FFFF), waar xxx - hexadecimaal cijfers. Het teken "I" (U+044F) heeft bijvoorbeeld de code 044F 16 = 1103 10 .

Coderingssysteem

Het Universal Coding System (Unicode) is een set van grafische symbolen en de manier om ze te coderen computer tekstgegevens verwerken.

Grafische symbolen zijn symbolen die een zichtbare afbeelding hebben. Grafische tekens worden gecontrasteerd met controletekens en opmaaktekens.

Grafische symbolen omvatten de volgende groepen:

  • leestekens;

    speciale tekens ( wiskundig, technisch, ideogrammen enz.);

    scheiders.

Unicode is een systeem voor lineaire weergave van tekst. Tekens met extra superscript- of subscript-elementen kunnen worden weergegeven als een reeks codes die volgens bepaalde regels zijn opgebouwd (samengesteld teken) of als een enkel teken (monolithische variant, vooraf samengesteld teken).

Karakters aanpassen

Weergave van het symbool “И” (U+0419) als basisteken “И” (U+0418) en het wijzigende teken “ ̆” (U+0306)

Grafische karakters in Unicode zijn onderverdeeld in uitgebreid en niet-uitgebreid (breedteloos). Wanneer ze worden weergegeven, nemen niet-uitgebreide tekens geen ruimte in beslag lijn. Hiertoe behoren met name accenttekens en andere diakritische tekens. Zowel uitgebreide als niet-uitgebreide symbolen hebben hun eigen codes. Uitgebreide symbolen worden ook wel basissymbolen genoemd ( Engels baseren karakters), en niet-uitgebreide - wijzigen ( Engels combineren karakters); Bovendien kunnen laatstgenoemden niet zelfstandig vergaderen. Het teken "á" kan bijvoorbeeld worden weergegeven als een reeks van het basisteken "a" (U+0061) en het wijzigende teken "́" (U+0301), of als een monolithisch teken "á" (U+ 00C1).

Een speciaal type wijzigingstekens zijn stijlvariantkiezers ( Engels variatie selectoren). Ze hebben alleen invloed op de symbolen waarvoor dergelijke varianten zijn gedefinieerd. In versie 5.0 zijn stijlopties gedefinieerd voor een aantal wiskundige symbolen, voor traditionele symbolen Mongools alfabet en voor karakters Mongoolse vierkante letter.

Vormen van normalisatie

Omdat dezelfde tekens door verschillende codes kunnen worden weergegeven, wat de verwerking soms moeilijk maakt, zijn er normalisatieprocessen ontworpen om tekst tot een bepaalde standaardvorm terug te brengen.

De Unicode-standaard definieert 4 vormen van tekstnormalisatie:

    De normalisatievorm D (NFD) is canonieke ontbinding. Tijdens het proces om de tekst in deze vorm te brengen, worden alle samengestelde karakters recursief vervangen door verschillende samengestelde karakters, in overeenstemming met de decompositietabellen.

    De normalisatievorm van C (NFC) is canonieke ontleding gevolgd door canonieke compositie. Eerst wordt de tekst gereduceerd tot vorm D, waarna een canonieke compositie wordt uitgevoerd - de tekst wordt van begin tot eind verwerkt en volgende regels:

    • Het symbool S is voorletter, als het wijzigingsklasse nul heeft in de Unicode-tekenbasis.

      In elke reeks karakters die begint met het initiële karakter S, wordt het karakter C geblokkeerd voor S als en alleen als er tussen S en C een karakter B is dat ofwel het initiële karakter is, ofwel dezelfde of een grotere modificatieklasse heeft dan C. Dit is de regel alleen van toepassing op snaren die canonieke ontbinding hebben ondergaan.

      Primair Een composiet is een teken met een canonieke ontleding in de Unicode-tekenbasis (of een canonieke ontleding voor hangul en hij hoort er niet bij lijst met uitzonderingen).

      Een teken X kan primair worden samengesteld met een teken Y als en slechts als er een primaire samengestelde Z is die canoniek equivalent is aan de reeks .

      Als het volgende symbool C niet wordt geblokkeerd door het laatst aangetroffen initiële basissymbool L en het er met succes primair mee kan worden gecombineerd, wordt L vervangen door de L-C-composiet en wordt C verwijderd.

    Normalisatieformulier KD (NFKD) is een compatibele decompositie. Wanneer ze naar deze vorm worden gegoten, worden alle samenstellende karakters vervangen met behulp van zowel canonieke Unicode-decompositiekaarten als compatibele decompositiekaarten, en het resultaat wordt vervolgens in canonieke volgorde geplaatst.

    Normalisatieformulier KC (NFKC) - compatibele ontleding gevolgd door canoniek samenstelling.

De termen “compositie” en “decompositie” betekenen respectievelijk de verbinding of decompositie van symbolen in hun samenstellende delen.

Voorbeelden

Originele tekst

\u0410, \u0401, \u0419

\u0410, \u0415\u0308, \u0418\u0306

\u0410, \u0401, \u0419

Bidirectioneel schrijven

De Unicode-standaard ondersteunt talen die zowel in de schrijfrichting van links naar rechts geschreven zijn ( Engels links- naar- rechts, LTR), en met schrijven van rechts naar links ( Engels rechts- naar- links, RTL) - Bijvoorbeeld, Arabisch En Joods brief. In beide gevallen worden karakters in een "natuurlijke" volgorde opgeslagen; rekening houden met hun weergave de goede richting brieven worden door de applicatie verstrekt.

Bovendien ondersteunt Unicode gecombineerde teksten die fragmenten met verschillende schrijfrichtingen combineren. Deze functie heet bidirectionaliteit (Engels bidirectioneel tekst, BiDi). Sommige vereenvoudigde tekstverwerkers (bijvoorbeeld in telefoons) ondersteunt mogelijk Unicode, maar biedt geen bidirectionele ondersteuning. Alle Unicode-tekens zijn onderverdeeld in verschillende categorieën: tekens die van links naar rechts worden geschreven, tekens die van rechts naar links worden geschreven en tekens die in welke richting dan ook worden geschreven. De symbolen van de laatste categorie (meestal leestekens) wanneer weergegeven, volg de richting van de omringende tekst.

Uitgelichte personages

Hoofd artikel: Tekens weergegeven in Unicode

Unicode-referentievlakdiagram, zie beschrijving

Unicode omvat bijna alle moderne schrijven, inbegrepen:

    Arabisch,

    Armeens,

    Bengaals,

    Birmees,

    Glagolitisch,

    Grieks,

    Georgisch,

    Devanagari,

    Joods,

    cyrillisch alfabet,

    Chinese(Chinese karakters worden actief gebruikt in Japans, en ook vrij zelden in Koreaans),

    Koptisch,

    Khmer,

    Latijns,

    Tamil,

    Koreaans (Hangul),

    Cherokee,

    Ethiopisch,

    Japans(waaronder behalve Chinese letters Ook syllabisch alfabet),

en anderen.

Er zijn veel historische geschriften toegevoegd voor academische doeleinden, waaronder: Germaanse runen, oude Turkse runen, oud Grieks, Egyptische hiërogliefen, spijkerschrift, Maya-schrift, Etruskisch alfabet.

Unicode biedt een breed scala aan wiskundig En muzikaal karakters, evenals pictogrammen.

Unicode bevat echter over het algemeen geen bedrijfs- en productlogo's, hoewel ze wel in lettertypen voorkomen (bijvoorbeeld het logo). Appel bij het coderen MacRoman(0xF0) of logo ramen in Wingdings-lettertype (0xFF)). In Unicode-lettertypen mogen logo's alleen in het aangepaste tekengebied worden geplaatst.

ISO/IEC 10646

Het Unicode Consortium werkt nauw samen met de ISO/IEC/JTC1/SC2/WG2-werkgroep die de Internationale Standaard 10646 ( ISO/IEC 10646). Er is synchronisatie tussen de Unicode-standaard en ISO/IEC 10646, hoewel elke standaard zijn eigen terminologie- en documentatiesysteem gebruikt.

Samenwerking tussen het Unicode Consortium en de Internationale Organisatie voor Standaardisatie ( Engels Internationale Organisatie voor Standaardisatie, ISO) startte in 1991 jaar. IN 1993 jaar ISO heeft de DIS 10646.1-standaard vrijgegeven. Om ermee te synchroniseren keurde het Consortium de Unicode-standaardversie 1.1 goed, die extra tekens uit DIS 10646.1 bevatte. Als gevolg hiervan vielen de betekenissen van de gecodeerde tekens in Unicode 1.1 en DIS 10646.1 volledig samen.

Vervolgens werd de samenwerking tussen de twee organisaties voortgezet. IN 2000 De Unicode 3.0-standaard is gesynchroniseerd met ISO/IEC 10646-1:2000. De komende derde versie van ISO/IEC 10646 zal worden gesynchroniseerd met Unicode 4.0. Mogelijk worden deze specificaties zelfs als één standaard gepubliceerd.

Vergelijkbaar met de formaten UTF-16 en UTF-32 in de Unicode-standaard, kent de ISO/IEC 10646-standaard ook twee basisvormen van tekencodering: UCS-2 (2 bytes per teken, vergelijkbaar met UTF-16) en UCS-4 (4 bytes per teken, vergelijkbaar met UTF-32). UCS betekent universeel multi-octet(multi-byte) gecodeerde tekenset (Engels universeel meerdere- octet gecodeerd karakter set). UCS-2 kan worden beschouwd als een subset van UTF-16 (UTF-16 zonder surrogaatparen), en UCS-4 is een synoniem voor UTF-32.

Presentatie methoden

Unicode kent verschillende representatievormen ( Engels Unicode-transformatieformaat, UTF): UTF-8, UTF-16(UTF-16BE, UTF-16LE) en UTF-32 (UTF-32BE, UTF-32LE). Het UTF-7-weergaveformulier is ook ontwikkeld voor verzending via zeven-bits kanalen, maar vanwege incompatibiliteit met ASCII het is niet wijdverspreid en is niet opgenomen in de standaard. 1 april 2005 Er werden twee komische representatievormen voorgesteld: UTF-9 en UTF-18 ( RFC4042).

IN Microsoft Windows NT en systemen die daarop zijn gebaseerd Windows 2000 En Windows XP grotendeels gebruikt UTF-16LE-formulier. IN UNIX-vergelijkbaar besturingssystemen GNU/Linux, BSD En Mac OS X de geaccepteerde vorm is UTF-8 voor bestanden en UTF-32 of UTF-8 voor het verwerken van tekens in werkgeheugen.

Punycode- een andere vorm van het coderen van reeksen Unicode-tekens in zogenaamde ACE-reeksen, die uitsluitend uit alfanumerieke tekens bestaan, zoals toegestaan ​​in domeinnamen.

Hoofd artikel: UTF-8

UTF-8 is een weergave van Unicode die de beste compatibiliteit biedt met oudere systemen die 8-bits tekens gebruikten. Tekst die alleen bestaat uit tekens met een nummer kleiner dan 128, wordt bij het schrijven naar UTF-8 geconverteerd platte tekst ASCII. Omgekeerd is dit in UTF-8-tekst niet het geval byte met een waarde kleiner dan 128 vertegenwoordigt een ASCII-teken met dezelfde code. De overige Unicode-tekens worden weergegeven als reeksen met een lengte van 2 tot 6 bytes (in feite slechts maximaal 4 bytes, aangezien Unicode geen tekens heeft met een code groter dan 10FFFF, en er geen plannen zijn om deze in de toekomst te introduceren ), waarbij de eerste byte altijd 11xxxxxx is en de rest 10xxxxxx.

Het UTF-8-formaat is uitgevonden 2 september 1992 Ken Thompson En Rob Pike en geïmplementeerd Plan 9 . Nu is de UTF-8-standaard officieel vastgelegd in documenten RFC3629 en ISO/IEC 10646 bijlage D.

UTF-8-tekens zijn afgeleid van Unicode op de volgende manier:

0x00000000 - 0x0000007F: 0xxxxxxx

0x00000080 - 0x000007FF: 110xxxx 10xxxxxx

0x00000800 - 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx

0x00010000 - 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Theoretisch mogelijk, maar ook niet standaard opgenomen:

0x00200000 - 0x03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

0x04000000 - 0x7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

Hoewel u met UTF-8 hetzelfde teken op verschillende manieren kunt specificeren, is alleen de kortste correct. Andere formulieren moeten om veiligheidsredenen worden afgewezen.

Bytevolgorde

In een UTF-16-datastroom kan de hoge byte vóór de lage byte worden geschreven ( Engels UTF-16 Little Endian), of na de minor ( Engels. UTF-16 big-endian). Op dezelfde manier zijn er twee opties voor codering van vier bytes: UTF-32LE en UTF-32BE.

Om het Unicode-weergaveformaat te bepalen, wordt het volgende naar het begin van het tekstbestand geschreven: handtekening- symbool U+FEFF ( niet-brekende ruimte nulbreedte), ook wel genoemd bytevolgordemarkering (Engels byte volgorde markering, BOM ). Dit maakt het mogelijk om onderscheid te maken tussen UTF-16LE en UTF-16BE, aangezien het U+FFFE-teken niet bestaat. Deze methode wordt soms ook gebruikt om het UTF-8-formaat aan te duiden, hoewel het concept van bytevolgorde niet van toepassing is op dit formaat. Bestanden die deze conventie volgen, beginnen met de volgende bytereeksen:

Helaas maakt deze methode geen betrouwbaar onderscheid tussen UTF-16LE en UTF-32LE, aangezien het U+0000-teken is toegestaan ​​door Unicode (hoewel echte tekst er zelden mee begint).

UTF-16- en UTF-32-gecodeerde bestanden die geen stuklijst bevatten, moeten in big-endian-bytevolgorde staan ​​( Unicode.org).

Unicode en traditionele coderingen

De introductie van Unicode leidde tot een verandering in de benadering van traditionele 8-bits coderingen. Als de codering eerder werd gespecificeerd door het lettertype, wordt deze nu gespecificeerd door een tabel met overeenkomsten tussen de gegeven codering en Unicode. In feite zijn 8-bits coderingen een vorm van representatie geworden voor een subset van Unicode. Dit heeft het veel gemakkelijker gemaakt om programma's te maken die met veel verschillende coderingen moeten werken: om nu ondersteuning voor een andere codering toe te voegen, hoeft u alleen maar nog een Unicode-conversietabel toe te voegen.

Bovendien kunt u in veel gegevensformaten alle Unicode-tekens invoegen, zelfs als het document in de oude 8-bits codering is geschreven. In HTML kunt u bijvoorbeeld gebruiken coderen met ampersand.

Implementaties

De meeste moderne besturingssystemen bieden een zekere mate van Unicode-ondersteuning.

In besturingssystemen van de familie Windows NT Voor de interne weergave van bestandsnamen en andere systeemstrings wordt de dubbel-byte UTF-16LE-codering gebruikt. Systeemaanroepen die stringparameters accepteren, zijn verkrijgbaar in varianten van één byte en dubbel byte. Zie het artikel voor meer informatie. .

UNIX-soortgelijke besturingssystemen, inclusief GNU/Linux, BSD, Mac OS X, gebruik UTF-8-codering om Unicode weer te geven. De meeste programma's kunnen UTF-8 behandelen alsof het traditionele coderingen van één byte zijn, ongeacht het feit dat een teken wordt weergegeven als meerdere opeenvolgende bytes. Werken met aparte karakters strings worden meestal gecodeerd naar UCS-4, zodat elk teken overeenkomt met machinewoord.

Een van de eerste succesvolle commerciële implementaties van Unicode was de programmeeromgeving Java. Het verliet fundamenteel de 8-bits weergave van karakters ten gunste van 16-bits. Deze oplossing verhoogde het geheugengebruik, maar stelde ons in staat een belangrijke abstractie terug te geven aan het programmeren: een willekeurig enkel teken (char-type). In het bijzonder zou de programmeur met een string kunnen werken alsof het een eenvoudige array is. Helaas was het succes niet definitief, Unicode ontgroeide de limiet van 16 bits en vanaf versie J2SE 5.0 begon opnieuw een willekeurig karakter in te nemen variabel getal geheugeneenheden - één of twee tekens (zie. surrogaat koppel).

De meeste programmeertalen ondersteunen nu Unicode-strings, hoewel hun weergave kan variëren afhankelijk van de implementatie.

Invoermethoden

Sinds geen toetsenbordindeling kan niet toestaan ​​dat alle Unicode-tekens in één keer worden ingevoerd, van besturingssystemen En applicatieprogramma's Ondersteuning voor alternatieve methoden voor het invoeren van willekeurige Unicode-tekens is vereist.

Microsoft Windows

Hoofd artikel: Unicode op Microsoft-besturingssystemen

Beginnend met Windows 2000, toont het hulpprogramma Charmap.exe alle tekens in het besturingssysteem en kunt u ze ernaar kopiëren klembord. Een soortgelijke tafel is bijvoorbeeld verkrijgbaar in Microsoft Word.

Soms kun je bellen hexadecimaal code, druk Alt+X, en de code wordt vervangen door het overeenkomstige teken, bijvoorbeeld in WordPad,Microsoft Word. In editors voert Alt+X ook de omgekeerde conversie uit.

In veel MS Windows-programma's moet u, om een ​​Unicode-teken te krijgen, op de Alt-toets drukken en de decimale waarde van de tekencode typen op numeriek toetsenbord. De combinaties Alt+0171 (“) en Alt+0187 (“”) zijn bijvoorbeeld handig bij het typen van Cyrillische teksten. Ook de combinaties Alt+0133 (…) en Alt+0151 (-) zijn interessant.

Macintosh-computer

IN MacOS 8,5 of meer latere versies Een invoermethode genaamd "Unicode Hex Input" wordt ondersteund. Wanneer vastgeklemd Optietoets u moet de viercijferige hexadecimale code van het gewenste teken kiezen. Met deze methode kunt u tekens invoeren met codes groter dan U+FFFF met behulp van surrogaatparen; dergelijke paren worden door het besturingssysteem automatisch vervangen door enkele tekens. Vóór gebruik moet deze invoermethode worden geactiveerd in de juiste sectie van de systeeminstellingen en vervolgens worden geselecteerd als de huidige invoermethode in het toetsenbordmenu.

Beginnend met Mac OS X 10.2 is er ook een toepassing “Character Palette” waarmee u tekens kunt selecteren uit een tabel waarin u tekens kunt selecteren uit een specifiek blok of tekens die worden ondersteund door een specifiek lettertype.

GNU/Linux

IN GNOME Er is ook een hulpprogramma “Symbolentabel” waarmee u de symbolen van een bepaald blok of schrijfsysteem kunt weergeven en waarmee u kunt zoeken op naam of beschrijving van het symbool. Wanneer de code van het gewenste teken bekend is, kan deze conform de standaard worden ingevoerd ISO 14755: terwijl u de toetsen Ctrl + ⇧ ingedrukt houdt Verschuiving binnenkomen hexadecimale code(Vanaf sommige versies van GTK+ moet het invoeren van de code worden voorafgegaan door op de toets te drukken "U"). De hexadecimale code die u invoert, kan maximaal 32 bits lang zijn, zodat u elk Unicode-teken kunt invoeren zonder gebruik te maken van surrogaatparen.

De standaard werd in 1991 voorgesteld door de non-profitorganisatie Unicode Consortium (Unicode Inc.). Door deze standaard te gebruiken, kunt u een zeer groot aantal tekens uit verschillende scripts coderen: Unicode-documenten kunnen Chinese karakters, wiskundige symbolen, letters van het Griekse alfabet, het Latijnse en Cyrillische alfabet bevatten, en het wisselen van codepagina's wordt overbodig.

De standaard bestaat uit twee hoofdsecties: de universele tekenset (UCS) en de coderingsfamilie (UTF, Unicode-transformatieformaat). De universele karakterset specificeert een één-op-één correspondentie tussen karakters en codes - elementen van de coderuimte die niet-negatieve gehele getallen vertegenwoordigen. Een coderingsfamilie definieert de machinerepresentatie van een reeks UCS-codes.

De Unicode-standaard is ontwikkeld om één tekencodering te creëren voor alle moderne en vele oude geschreven talen. Elk teken in deze standaard is gecodeerd met 16 bits, waardoor het een onvergelijkbaar groter aantal tekens kan bestrijken dan voorheen geaccepteerde 8-bits coderingen. Nog een belangrijk verschil Unicode verschilt van andere coderingssystemen doordat het niet alleen aan elk teken een unieke code toekent, maar ook definieert verschillende kenmerken dit karakter, bijvoorbeeld:

Tekentype (hoofdletter, kleine letter, nummer, leesteken, enz.);

Tekenattributen (weergave van links naar rechts of rechts naar links, spatie, regeleinde, etc.);

De bijbehorende hoofdletter of kleine letter (voor kleine letters en hoofdletters respectievelijk);

Relevant numerieke waarde(voor digitale karakters).

Het volledige codebereik van 0 tot FFFF is verdeeld in verschillende standaardsubsets, die elk overeenkomen met het alfabet van een taal of met een groep speciale karakters, vergelijkbaar in hun functies. Het onderstaande diagram bevat een algemene lijst met Unicode 3.0-subsets (Afbeelding 2).

Figuur 2

De Unicode-standaard vormt de basis voor het opslaan van tekst in veel moderne computersystemen. Het is echter niet compatibel met de meeste internetprotocollen omdat de codes elke bytewaarde kunnen bevatten, en protocollen gebruiken doorgaans bytes 00 - 1F en FE - FF als servicebytes. Om compatibiliteit te bereiken zijn er verschillende Unicode-transformatieformaten (UTF's, Unicode Transformation Formats) ontwikkeld, waarvan UTF-8 tegenwoordig de meest voorkomende is. Dit formaat definieert de volgende regels voor het converteren van elke Unicode-code naar een set bytes (één tot drie) die geschikt zijn voor transport via internetprotocollen.


Hier duiden x,y,z bits aan broncode, die moet worden opgehaald, beginnend met de minst significante, en van rechts naar links in de resultaatbytes moet worden ingevoerd totdat alle opgegeven posities zijn gevuld.

Verdere ontwikkeling van de Unicode-standaard gaat gepaard met de toevoeging van nieuwe taalgebieden, d.w.z. tekens in het bereik 10000 - 1FFFF, 20000 - 2FFFF, enz., waar het codering zou moeten bevatten voor scripts van dode talen die niet in de bovenstaande tabel zijn opgenomen. Om deze extra karakters te coderen, werd het ontwikkeld nieuw formaat UTF-16.

Er zijn dus vier manieren om Unicode-bytes te coderen:

UTF-8: 128 tekens gecodeerd in één byte (ASCII-formaat), 1920 tekens gecodeerd in 2 bytes ((Romeinse, Griekse, Cyrillische, Koptische, Armeense, Hebreeuwse, Arabische tekens), 63488 tekens gecodeerd in 3 bytes (Chinese, Japanse enz. .) De overige 2.147.418.112 tekens (nog niet gebruikt) kunnen worden gecodeerd met 4, 5 of 6 bytes.

UCS-2: Elk teken wordt weergegeven door 2 bytes. Deze codering omvat alleen de eerste 65.535 tekens uit het Unicode-formaat.

UTF-16: een uitbreiding van UCS-2 en bevat 1.114.112 tekens in Unicode-formaat. De eerste 65.535 tekens worden weergegeven door 2 bytes, de rest door 4 bytes.

USC-4: Elk teken is gecodeerd in 4 bytes.

Unicode wel internationale standaard tekencoderingen waarmee tekst consistent kan worden weergegeven op elke computer ter wereld, ongeacht de systeemtaal die erop wordt gebruikt.

Basisprincipes

Om te begrijpen waar een Unicode-tekentabel voor dient, moeten we eerst het mechanisme begrijpen voor het weergeven van tekst op een beeldscherm. Een computer verwerkt, zoals we weten, alle informatie in digitale vorm en moet deze grafisch weergeven voor een correcte menselijke waarneming. Om deze tekst te kunnen lezen, moeten we dus minstens twee problemen oplossen:

  • Coderen gedrukte karakters in digitale vorm.
  • Geef het besturingssysteem de mogelijkheid om de digitale vorm te matchen met de vectortekens, met andere woorden, de juiste letters te vinden.

Eerste coderingen

Amerikaanse ASCII wordt beschouwd als de voorloper van alle coderingen. Hierin werd de gebruikte methode beschreven de Engelse taal Latijns alfabet met leestekens en Arabische cijfers. Het waren de 128 symbolen die erin gebruikt werden die de basis vormden voor latere ontwikkelingen – ze worden zelfs gebruikt door moderne tafel Unicode-tekens. Letters van het Latijnse alfabet hebben sindsdien in elke codering de eerste positie ingenomen.

In totaal kon ASCII 256 tekens opslaan, maar aangezien de eerste 128 werden bezet door het Latijnse alfabet, werden de overige 128 over de hele wereld gebruikt om nationale standaarden te creëren. In Rusland werden bijvoorbeeld CP866 en KOI8-R op basis hiervan gemaakt. Dergelijke variaties werden uitgebreide versies van ASCII genoemd.

Codepagina's en "krakozyabry"

Verdere ontwikkeling van de technologie en de opkomst van een grafische interface leidden tot de creatie van de ANSI-codering door het American Standards Institute. Russische gebruikers, vooral met ervaring, de versie ervan is bekend onder genaamd Windows 1251. Het concept van “codetabel” werd er voor het eerst in gebruikt. Met behulp van codepagina's die karakters bevatten uit andere nationale alfabetten dan het Latijn, kwam er 'wederzijds begrip' tot stand tussen computers die in verschillende landen werden gebruikt.

De aanwezigheid van een groot aantal verschillende coderingen die voor één taal werden gebruikt, begon echter problemen te veroorzaken. De zogenaamde krakozyabrs verschenen. Ze kwamen voort uit een discrepantie tussen de broncodepagina waarin informatie werd aangemaakt en de standaardcodepagina die op de computer van de eindgebruiker werd gebruikt.

Als voorbeeld kunnen we de bovenstaande Cyrillische coderingen CP866 en KOI8-R aanhalen. De letters daarin verschilden in codeposities en plaatsingsprincipes. In de eerste werden ze geplaatst alfabetische volgorde, en in de tweede - in een willekeurige. U kunt zich voorstellen wat er gebeurde voor de ogen van een gebruiker die zo'n tekst probeerde te openen zonder over de vereiste codepagina te beschikken of wanneer deze door de computer verkeerd werd geïnterpreteerd.

Creatie van Unicode

De verspreiding van internet en aanverwante technologieën zoals E-mail, leidde ertoe dat de situatie met de vervorming van teksten uiteindelijk niet meer voor iedereen geschikt was. Toonaangevende IT-bedrijven hebben het Unicode Consortium opgericht. De karaktertabel die hij in 1991 introduceerde, genaamd UTF-32, kon meer dan een miljard unieke karakters opslaan. Het was de belangrijkste stap op weg naar het ontcijferen van teksten.

De eerste universele tabel met tekencodes, Unicode UTF-32, werd echter niet veel gebruikt. De belangrijkste reden was de redundantie van opgeslagen informatie. Al snel werd berekend dat voor landen die het Latijnse alfabet gebruiken, het nieuwe alfabet wordt gecodeerd universele tafel, neemt de tekst vier keer meer ruimte in beslag dan bij gebruik van een uitgebreide ASCII-tabel.

Ontwikkeling van Unicode

De volgende Unicode UTF-16-tekentabel loste dit probleem op. Het coderen daarin werd uitgevoerd met de helft van het aantal bits, maar tegelijkertijd nam het aantal mogelijke combinaties af. In plaats van miljarden tekens kun je er slechts 65.536 opslaan. Niettemin bleek het zo succesvol dat dit aantal, volgens de beslissing van het Consortium, werd gedefinieerd als de basisopslagruimte voor standaard Unicode-tekens.

Ondanks dit succes was UTF-16 niet voor iedereen geschikt, omdat de hoeveelheid opgeslagen en doorgegeven informatie werd nog steeds verdubbeld. Een universele oplossing werd UTF-8, een Unicode-tekentabel met variabele lengte. Dit kan een doorbraak op dit gebied worden genoemd.

Met de introductie van de laatste twee standaarden loste de Unicode-tekentabel dus het probleem op van één enkele coderuimte voor alle lettertypen die momenteel in gebruik zijn.

Unicode voor de Russische taal

Vanwege de variabele lengte van de code die wordt gebruikt om tekens weer te geven, wordt het Latijnse alfabet in Unicode op dezelfde manier gecodeerd als in zijn voorloper ASCII, dat wil zeggen in één bit. Bij andere alfabetten kan de afbeelding er anders uitzien. Tekens van het Georgische alfabet gebruiken bijvoorbeeld drie bytes voor codering, en tekens van het Cyrillische alfabet gebruiken er twee. Dit alles is mogelijk binnen het kader van het gebruik van de UTF-8 Unicode-standaard (karaktertabel). Het Russische of Cyrillische alfabet neemt 448 posities in de algemene coderuimte in, verdeeld in vijf blokken.

Deze vijf blokken omvatten het basis-Cyrillische en Kerkslavische alfabet, evenals aanvullende letters uit andere talen die het Cyrillische alfabet gebruiken. Een aantal posities is toegewezen om oude vormen van Cyrillische letters weer te geven, en 22 posities van het totaal zijn nog steeds vrij.

Huidige versie van Unicode

Met de oplossing van zijn voornaamste taak, namelijk het standaardiseren van lettertypen en het creëren van één enkele coderuimte ervoor, stopte het Consortium zijn werk niet. Unicode evolueert voortdurend en breidt zich voortdurend uit. Laatst huidige versie Deze standaard 9.0 is uitgebracht in 2016. Het bevatte zes extra alfabetten en breidde de lijst met gestandaardiseerde emoji uit.

Het moet gezegd worden dat om het onderzoek te vereenvoudigen zelfs zogenaamde dode talen aan Unicode worden toegevoegd. Ze hebben deze naam gekregen omdat er geen mensen zijn voor wie het inheems is. Tot deze groep behoren ook talen die onze tijd alleen in de vorm van geschreven monumenten hebben bereikt.

Kortom, van toepassing om tekens toe te voegen nieuwe specificatie Iedereen kan Unicode gebruiken. Toegegeven, hiervoor zul je een behoorlijk aantal initiële documenten moeten invullen en veel tijd moeten besteden. Een levend voorbeeld hiervan is het verhaal van programmeur Terence Eden. In 2013 heeft hij een aanvraag ingediend om in de specificatie symbolen op te nemen die verband houden met de aanduiding van de aan/uit-bedieningsknoppen van de computer. IN technische documentatie ze zijn in gebruik sinds het midden van de jaren zeventig, maar maakten pas met de 9.0-specificatie deel uit van Unicode.

symbool tafel

Elke computer, ongeacht het gebruikte besturingssysteem, gebruikt de Unicode-tekentabel. Hoe gebruikt u deze tabellen, waar kunt u ze vinden en waarom kunnen ze nuttig zijn voor de gemiddelde gebruiker?

In Windows OS bevindt de symbolentabel zich in het menugedeelte "Hulpprogramma's". In de operatiekamerfamilie Linux-systemen het is meestal te vinden in de subsectie "Accessoires" en op MacOS - in de toetsenbordinstellingen. Het belangrijkste doel van deze tabel is om binnen te komen tekstdocumenten tekens die niet op het toetsenbord staan.

Het breedste scala aan toepassingen voor dergelijke tabellen is te vinden: van het invoeren van technische symbolen tot nationale symbolen monetaire systemen voordat u instructies schrijft voor praktische toepassing Tarot kaarten.

Eindelijk

Unicode wordt overal gebruikt en is in ons leven terechtgekomen met de ontwikkeling van internet en mobiele technologieën. Dankzij het gebruik ervan is het systeem van interetnische communicatie aanzienlijk vereenvoudigd. We kunnen zeggen dat de introductie van Unicode een illustratief, maar van buitenaf volledig onzichtbaar voorbeeld is van het gebruik van technologie voor het algemeen welzijn van de hele mensheid.

Unicode of Unicode (van het Engelse woord Unicode) is een tekencoderingsstandaard. Het maakt het mogelijk dat vrijwel alle geschreven talen in de codering worden weergegeven.

Eind jaren tachtig werd de rol van de standaard toegewezen aan 8-bits karakters. Er werden 8-bits coderingen geïntroduceerd diverse wijzigingen, waarvan het aantal voortdurend groeide. Dit was vooral het resultaat van een actieve uitbreiding van het scala aan gebruikte talen. Er was ook een wens onder ontwikkelaars om met een codering te komen die op zijn minst gedeeltelijke universaliteit zou claimen.

Als gevolg hiervan werd het noodzakelijk om verschillende problemen op te lossen:

  • Problemen met het weergeven van documenten met onjuiste codering. Het probleem kan worden opgelost door consequent methoden te introduceren voor het specificeren van de gebruikte codering, of door één enkele codering voor iedereen in te voeren;
  • problemen met beperkte tekenpakketten, die kunnen worden opgelost door lettertypen in het document te wisselen of door uitgebreide codering te introduceren;
  • het probleem van het transformeren van coderingen van de ene naar de andere, dat mogelijk leek op te lossen door gebruik te maken van een tussentransformatie (derde codering), inclusief karakters uit verschillende coderingen, of door conversietabellen samen te stellen voor elke twee coderingen;
  • problemen met het dupliceren van individuele lettertypen. Traditioneel veronderstelde elke codering de aanwezigheid van een eigen lettertype, zelfs als de coderingen geheel of gedeeltelijk samenvielen in de tekenset. Tot op zekere hoogte werd het probleem opgelost met behulp van "grote" lettertypen, waaruit vervolgens de tekens werden geselecteerd die nodig waren voor een specifieke codering. Maar om de mate van naleving te bepalen, was het noodzakelijk om te creëren enkel register karakters.

De vraag naar de noodzaak om een ​​“brede” uniforme codering te creëren stond dus op de agenda. Gebruikt in Zuid-Oost Azië coderingen met verschillende karakterlengtes leken te moeilijk om te gebruiken. Daarom werd de nadruk gelegd op het gebruik van een teken met een vaste breedte. 32-bits karakters leken te omslachtig en 16-bits karakters wonnen uiteindelijk.

De standaard werd in 1991 door een non-profitorganisatie aan de internetgemeenschap voorgesteld "Unicode-consortium". Het gebruik ervan maakt het mogelijk om te coderen een groot aantal van karakters verschillende soorten schrijven. Unicode-documenten staan ​​niet dicht bij elkaar Chinese letters, noch wiskundige symbolen, noch Cyrillisch, noch Latijn. In dit geval vereisen codetabellen tijdens het bedrijf geen schakeling.

De standaard bestaat uit twee hoofdsecties: de universele tekenset (UCS) en de coderingsfamilie (UTF in het Engels). De universele tekenset zorgt voor een unieke evenredigheid met tekencodes. De codes zijn in dit geval elementen van de codesfeer, die niet-negatieve gehele getallen zijn. De functie van een coderingsfamilie is het bepalen van de machinerepresentatie van een reeks UCS-codes.

In de Unicode-standaard worden codes in verschillende gebieden ingedeeld. Netnummers variërend van U+0000 tot U+007F bevatten ASCII-tekens met de vereiste codes. Verderop zijn er gebieden met symbolen van verschillende scripts, technische symbolen en leestekens. Er wordt een aparte batch codes gereserveerd voor toekomstig gebruik. Voor het Cyrillische alfabet zijn de volgende tekengebieden met codes gedefinieerd: U+0400 - U+052F, U+2DE0 - U+2DFF, U+A640 - U+A69F.

Het belang van deze codering in de webruimte groeit onverbiddelijk. Begin 2010 bedroeg het aandeel sites dat Unicode gebruikte bijna 50 procent.

Unicode is een zeer grote en complexe wereld, omdat je met de standaard alle belangrijke scripts van de wereld op een computer kunt weergeven en erop kunt werken. Sommige schrijfsystemen bestaan ​​al meer dan duizend jaar, en vele daarvan hebben zich vrijwel onafhankelijk van elkaar in verschillende delen van de wereld ontwikkeld. Mensen hebben zoveel dingen bedacht en ze verschillen vaak zo van elkaar dat het een uiterst moeilijke en ambitieuze taak was om ze allemaal in één standaard te combineren.

Om Unicode echt te begrijpen, moet je op zijn minst een oppervlakkig begrip hebben van de kenmerken van alle scripts waarmee je volgens de standaard kunt werken. Maar is dit wat elke ontwikkelaar nodig heeft? Wij zeggen nee. Om Unicode voor de meeste alledaagse taken te kunnen gebruiken, volstaat het om over een redelijk minimum aan kennis te beschikken, en je vervolgens indien nodig in de standaard te verdiepen.

In dit artikel zullen we het hebben over de basisprincipes van Unicode en de belangrijkste benadrukken praktische vragen, die ontwikkelaars zeker tegen zullen komen in hun dagelijkse werk.

Waarom was Unicode nodig?

Vóór de komst van Unicode werden coderingen van één byte bijna universeel gebruikt, waarbij de grens tussen de karakters zelf, hun weergave in het computergeheugen en de weergave op het scherm tamelijk willekeurig was. Als u met een of andere nationale taal werkte, werden de overeenkomstige coderingslettertypen op uw systeem geïnstalleerd, waardoor u bytes van de schijf op het scherm kon tekenen op een manier die logisch was voor de gebruiker.

Als u op een printer hebt afgedrukt tekstbestand en op de papieren pagina zag je een reeks onbegrijpelijke wartaal, wat betekende dat de juiste lettertypen niet in het afdrukapparaat waren geladen en dat het de bytes niet interpreteerde zoals je zou willen.

Deze aanpak in het algemeen en single-byte-coderingen in het bijzonder hadden een aantal belangrijke nadelen:

  1. Het was mogelijk om tegelijkertijd met slechts 256 tekens te werken, waarbij de eerste 128 gereserveerd waren voor Latijnse en controletekens, en in de tweede helft was het, naast de symbolen van het nationale alfabet, nodig om een ​​plaats te vinden voor pseudografische symbolen ( ╔ ╗).
  2. Lettertypen waren gebonden aan een specifieke codering.
  3. Elke codering vertegenwoordigde zijn eigen reeks karakters, en conversie van de ene naar de andere was alleen mogelijk met gedeeltelijke verliezen, toen ontbrekende karakters werden vervangen door grafisch vergelijkbare karakters.
  4. Het overbrengen van bestanden tussen apparaten met verschillende besturingssystemen was moeilijk. Je moest ofwel een conversieprogramma hebben, ofwel het bij het bestand dragen extra lettertypen. Het bestaan ​​van het internet zoals wij dat kennen was onmogelijk.
  5. Er zijn niet-alfabetische schrijfsystemen in de wereld (hiërogliefenschrift), die in principe niet kunnen worden weergegeven in een codering van één byte.

Basisprincipes van Unicode

We begrijpen allemaal heel goed dat een computer geen ideale entiteiten kent, maar met bits en bytes werkt. Maar computersystemen Hoewel mensen creëren en geen machines, is het soms handiger voor jou en mij om met speculatieve concepten te werken en dan van het abstracte naar het concrete te gaan.

Belangrijk! Een van de centrale principes De Unicode-filosofie maakt een duidelijk onderscheid tussen karakters, hun weergave op een computer en hun weergave op een uitvoerapparaat.

Het concept van een abstract Unicode-teken wordt geïntroduceerd, dat uitsluitend bestaat in de vorm van een speculatief concept en een overeenkomst tussen mensen, vastgelegd in de standaard. Elk Unicode-teken is gekoppeld aan een niet-negatief geheel getal dat het codepunt wordt genoemd.

Het Unicode-teken U+041F is bijvoorbeeld de Cyrillische hoofdletter P. Er zijn verschillende weergavemogelijkheden van dit symbool in het geheugen van de computer, net zoals op duizenden manieren om deze op het beeldscherm weer te geven. Maar tegelijkertijd zal het in Afrika ook P of U+041F zijn.

Dit is de bekende inkapseling of scheiding van de interface en de implementatie - een concept dat zich goed heeft bewezen in de programmering.

Het blijkt dat, geleid door de standaard, elke tekst kan worden gecodeerd als een reeks Unicode-tekens

Hallo U+041F U+0440 U+0438 U+0432 U+0435 U+0442
schrijf het op een stuk papier, stop het in een envelop en stuur het naar waar dan ook ter wereld. Als ze op de hoogte zijn van het bestaan ​​van Unicode, zal de tekst door hen op precies dezelfde manier worden waargenomen als door jou en mij. Ze zullen er niet de minste twijfel over hebben dat het voorlaatste teken de Cyrillische kleine letter is e(U+0435), en zeg niet Latijn klein e(U+0065). Merk op dat we nog geen woord hebben gezegd over de byterepresentatie.

Hoewel Unicode-tekens symbolen worden genoemd, komen ze niet altijd overeen met een symbool in de traditionele naïeve zin, zoals een letter, cijfer, leesteken of hiëroglief. (Zie spoiler voor meer details.)

Voorbeelden van verschillende Unicode-tekens

Er zijn puur technische Unicode-tekens, bijvoorbeeld:

  • U+0000: nulteken;
  • U+D800–U+DFFF: junior en senior surrogaten voor technische presentatie codeposities in het bereik van 10000 tot 10FFFF (lees: buiten BMYAP/BMP) in de UTF-16-coderingsfamilie;
  • enz.
Er zijn leestekens, bijvoorbeeld U+200F: een markering waarmee je de schrijfrichting van rechts naar links kunt veranderen.

Er is een hele reeks ruimtes met verschillende breedtes en doeleinden (zie uitstekend Habra-artikel:):

  • U+0020 (spatie);
  • U+00A0 (vaste spatie, in HTML);
  • U+2002 (halfronde inbedding of En Space);
  • U+2003 (insluiten of Em Space);
  • enz.
Er zijn gecombineerde diakritische tekens - allerlei soorten streken, punten, tildes, enz., die de betekenis van het vorige teken en de stijl ervan veranderen/verduidelijken. Bijvoorbeeld:
  • U+0300 en U+0301: tekenen van primaire (acute) en secundaire (zwakke) stress;
  • U+0306: kort (superscript), zoals in th;
  • U+0303: tilde in superscript;
  • enz.
Er bestaat zelfs iets exotisch, zoals taaltags (U+E0001, U+E0020–U+E007E en U+E007F), die zich momenteel in het ongewisse bevinden. Ze waren bedoeld als een manier om bepaalde tekstgedeelten te markeren als behorend tot een bepaalde taalvariant (bijvoorbeeld Amerikaans en Brits Engels), wat van invloed zou kunnen zijn op de details van hoe de tekst werd weergegeven.

We zullen je de volgende keer vertellen wat een symbool is, hoe een grafeemcluster (lees: waargenomen als een enkel beeld van een symbool) verschilt van een Unicode-symbool en van een codekwantum.

Unicode-coderuimte

De Unicode-coderuimte bestaat uit 1.114.112 codeposities variërend van 0 tot 10FFFF. Hiervan zijn er slechts 128.237 toegewezen aan waarden voor de negende versie van de standaard. Een deel van de ruimte is gereserveerd voor privégebruik en het Unicode Consortium belooft nooit waarden toe te kennen aan posities in deze speciale gebieden.

Voor het gemak is de gehele ruimte verdeeld in 17 vlakken (momenteel zijn er zes in gebruik). Tot voor kort werd algemeen gezegd dat je hoogstwaarschijnlijk alleen het Basic Multilingual Plane (BMP) tegenkomt, dat Unicode-tekens bevat van U+0000 tot U+FFFF. (Een beetje vooruitkijkend: tekens uit BMP worden in UTF-16 weergegeven door twee bytes, niet door vier). Anno 2016 bestaat er al twijfel over dit proefschrift. Populaire Emoji-tekens kunnen bijvoorbeeld heel goed in een gebruikersbericht voorkomen en u moet deze correct kunnen verwerken.

Coderingen

Als we tekst via internet willen verzenden, moeten we een reeks Unicode-tekens coderen als een reeks bytes.

De Unicode-standaard bevat een beschrijving van een aantal Unicode-coderingen, zoals UTF-8 en UTF-16BE/UTF-16LE, waarmee de volledige tekenruimte kan worden gecodeerd. Conversie tussen deze coderingen kan vrij worden uitgevoerd zonder verlies van informatie.

Bovendien heeft niemand de single-byte-coderingen geannuleerd, maar je kunt er wel je eigen individuele en zeer smalle stukje van het Unicode-spectrum mee coderen - 256 of minder codeposities. Voor dergelijke coderingen bestaan ​​er tabellen die voor iedereen beschikbaar zijn, waarbij elke waarde van een enkele byte wordt geassocieerd met een Unicode-teken (zie bijvoorbeeld CP1251.TXT). Ondanks de beperkingen blijken single-byte-coderingen erg praktisch te zijn als het gaat om het werken met een groot aantal eentalige tekst informatie.

Van de Unicode-coderingen is UTF-8 de meest voorkomende op internet (het won de palm in 2008), voornamelijk vanwege de efficiëntie en transparante compatibiliteit met zeven-bits ASCII. Latijnse en diensttekens, basisleestekens en cijfers - d.w.z. alle zeven-bits ASCII-tekens worden in UTF-8 gecodeerd als één byte, hetzelfde als in ASCII. De karakters van veel belangrijke scripts, afgezien van enkele zeldzamere hiëroglifische karakters, worden daarin weergegeven door twee of drie bytes. De grootste codepositie gedefinieerd door de standaard, 10FFFF, wordt gecodeerd in vier bytes.

Houd er rekening mee dat UTF-8 een codering met variabele codelengte is. Elk Unicode-teken daarin wordt weergegeven door een reeks codequantums met een minimale lengte van één quantum. Het getal 8 betekent de bitlengte van de code-eenheid (code-eenheid) - 8 bits. Voor de UTF-16-coderingsfamilie is de grootte van het codekwantum dienovereenkomstig 16 bits. Voor UTF-32 - 32 bits.

Als u een HTML-pagina met Cyrillische tekst over het netwerk verzendt, kan UTF-8 een zeer aanzienlijk voordeel opleveren, omdat alle markup, evenals JavaScript- en CSS-blokken, worden effectief in één byte gecodeerd. Bijv Startpagina Habra in UTF-8 neemt 139Kb in beslag, en in UTF-16 is dit al 256Kb. Ter vergelijking: als u win-1251 gebruikt waarbij de mogelijkheid om bepaalde tekens op te slaan verloren gaat, wordt de grootte, vergeleken met UTF-8, met slechts 11 KB teruggebracht tot 128 KB.

Om tekenreeksinformatie in toepassingen op te slaan, worden vaak 16-bits Unicode-coderingen gebruikt vanwege hun eenvoud, evenals het feit dat de karakters van 's werelds belangrijkste schrijfsystemen zijn gecodeerd in één zestien-bits kwantum. Java gebruikt bijvoorbeeld met succes UTF-16 voor interne tekenreeksrepresentatie. operatiekamer Windows-systeem maakt intern ook gebruik van UTF-16.

Hoe dan ook, zolang we in de Unicode-ruimte blijven, maakt het niet echt uit hoe stringinformatie binnen een individuele applicatie wordt opgeslagen. Als je met het interne opslagformaat alle meer dan een miljoen codeposities correct kunt coderen en er geen informatie verloren gaat aan de applicatiegrens, bijvoorbeeld bij het lezen uit een bestand of kopiëren naar het klembord, dan is alles in orde.

Om tekst die van een schijf of van een netwerkaansluiting wordt gelezen correct te interpreteren, moet u eerst de codering ervan bepalen. Dit gebeurt ofwel met behulp van meta-informatie die door de gebruiker wordt aangeleverd, geschreven in of naast de tekst, ofwel heuristisch bepaald.

Kortom

Er is veel informatie en het is logisch om een ​​korte samenvatting te geven van alles wat hierboven is geschreven:
  • Unicode postuleert een duidelijk onderscheid tussen karakters, hun weergave op een computer en hun weergave op een uitvoerapparaat.
  • Unicode-tekens komen niet altijd overeen met een teken in de traditioneel-naïeve zin, zoals een letter, cijfer, leesteken of hiëroglief.
  • De Unicode-coderuimte bestaat uit 1.114.112 codeposities variërend van 0 tot 10FFFF.
  • Het meertalige basisvlak omvat Unicode-tekens U+0000 tot U+FFFF, die in UTF-16 als twee bytes zijn gecodeerd.
  • Met elke Unicode-codering kunt u de volledige ruimte van Unicode-codeposities coderen, en de conversie tussen verschillende van dergelijke coderingen wordt uitgevoerd zonder verlies van informatie.
  • Met coderingen van één byte kunt u alleen coderen een klein deel Unicode-spectrum, maar kan handig zijn bij het werken met een grote hoeveelheid eentalige informatie.
  • UTF-8- en UTF-16-coderingen hebben variabele codelengtes. In UTF-8 kan elk Unicode-teken worden gecodeerd in één, twee, drie of vier bytes. In UTF-16 - twee of vier bytes.
  • Het interne formaat voor het opslaan van tekstinformatie binnen een afzonderlijke applicatie kan willekeurig zijn correcte werking met de volledige Unicode-codepositieruimte en geen verlies tijdens grensoverschrijdende gegevensoverdracht.

Een korte opmerking over coderen

Er kan enige verwarring bestaan ​​over de term codering. Binnen Unicode vindt codering tweemaal plaats. De eerste keer dat een Unicode-tekenset wordt gecodeerd, in die zin dat aan elk Unicode-teken een overeenkomstige codepositie wordt toegewezen. Dit proces verandert de Unicode-tekenset in een gecodeerde tekenset. De tweede keer wordt de reeks Unicode-tekens omgezet in een bytestring en dit proces wordt ook wel codering genoemd.

In de Engelse terminologie zijn er twee verschillende werkwoorden: coderen en coderen, maar zelfs moedertaalsprekers raken er vaak mee in de war. Bovendien wordt de term tekenset of tekenset gebruikt als synoniem voor de term gecodeerde tekenset.

We zeggen dit allemaal tegen het feit dat het zinvol is om aandacht te besteden aan de context en onderscheid te maken tussen situaties waarin we het hebben over de codepositie van een abstract Unicode-teken en wanneer we het hebben over de byte-representatie ervan.

Eindelijk

Er zit zoveel in Unicode verschillende aspecten dat het onmogelijk is om alles in één artikel te behandelen. En het is onnodig. Bovenstaande informatie is voldoende om verwarring in de basisprincipes te voorkomen en bij de meeste alledaagse taken met tekst te kunnen werken (lees: zonder verder te gaan dan het BMP). In de volgende artikelen zullen we het hebben over normalisatie en een completer beeld geven historisch overzicht ontwikkeling van coderingen, we zullen praten over de problemen van de Russischtalige Unicode-terminologie, en er ook materiaal over maken praktische aspecten met behulp van UTF-8 en UTF-16.