Vad är unicode-kodning till för? Exempel på olika unicode-tecken


Unicode är en mycket stor och komplex värld, eftersom standarden låter dig representera och arbeta på en dator med alla de stora skripten i världen. Vissa skriftsystem har funnits i mer än tusen år, och många av dem har utvecklats nästan oberoende av varandra i olika delar av världen. Människor har kommit på så många saker och det är ofta så olika varandra att det var en oerhört svår och ambitiös uppgift att kombinera allt detta till en enda standard.

För att verkligen förstå Unicode måste du åtminstone ytligt föreställa dig funktionerna i alla skript som standarden tillåter dig att arbeta med. Men är det verkligen nödvändigt för varje utvecklare? Vi säger nej. För att använda Unicode i de flesta vardagliga sysslor räcker det att ha ett rimligt minimum av kunskap, och sedan fördjupa sig i standarden efter behov.

I den här artikeln kommer vi att prata om de grundläggande principerna för Unicode och lyfta fram de viktiga praktiska problem som utvecklare säkert kommer att möta i sitt dagliga arbete.

Varför behövs Unicode?

Före tillkomsten av Unicode användes enkelbyte-kodningar nästan universellt, där gränsen mellan tecknen själva, deras representation i datorminne och visning på skärmen var ganska villkorlig. Om du arbetade med ett eller annat nationellt språk, installerades motsvarande kodningsteckensnitt på ditt system, vilket gjorde att du kunde rita bytes från disken på skärmen på ett sådant sätt att de är meningsfulla för användaren.

Om du har skrivit ut textfil och på papperssidan såg de en uppsättning obegripliga krakozyabr, detta innebar att motsvarande typsnitt inte laddades in i utskriftsenheten och den tolkar byten inte som du skulle vilja.

Detta tillvägagångssätt i allmänhet och enkelbyte-kodningar i synnerhet hade ett antal betydande nackdelar:

  1. Det var möjligt att arbeta samtidigt med endast 256 tecken, och de första 128 var reserverade för latinska tecken och kontrolltecken, och under den andra halvan, förutom tecknen i det nationella alfabetet, var det nödvändigt att hitta en plats för pseudografiska tecken ( ╔ ╗).
  2. Typsnitten var knutna till en specifik kodning.
  3. Varje kodning representerade sin egen uppsättning tecken, och konvertering från en till en annan var endast möjlig med partiella förluster, när saknade tecken ersattes med grafiskt liknande.
  4. Det var svårt att överföra filer mellan enheter som kör olika operativsystem. Det var nödvändigt att antingen ha ett omvandlingsprogram eller att ta med ytterligare typsnitt tillsammans med filen. Existensen av Internet som vi känner det var omöjligt.
  5. Det finns icke-alfabetiska skriftsystem i världen (hieroglyfisk skrift), som i princip inte är representativa i en enbyte-kodning.

Grunderna i Unicode

Vi förstår alla mycket väl att datorn inte känner till några idealiska enheter, utan arbetar med bitar och bytes. Men datorsystemän så länge skapar människor, inte maskiner, och för dig och mig är det ibland bekvämare att arbeta med spekulativa koncept och sedan gå från det abstrakta till det konkreta.

Viktig! En av de centrala principerna i Unicodes filosofi är en tydlig skillnad mellan tecken, deras representation på en dator och deras visning på en utenhet.

Konceptet med ett abstrakt Unicode-tecken introduceras, som endast existerar i form av ett spekulativt koncept och en överenskommelse mellan människor, fastställd av standarden. Varje Unicode-tecken tilldelas ett icke-negativt heltal som kallas dess kodpunkt.

Så till exempel är Unicode-tecknet U+041F en versal kyrillisk bokstav P. Det finns flera sätt att presentera given symbol i datorns minne, samt flera tusen sätt att visa det på skärmen. Men samtidigt P blir det P eller U + 041F i Afrika.

Detta är den välkända inkapslingen eller separationen av gränssnittet från implementeringen - ett koncept som har bevisat sig i programmering.

Det visar sig att, guidad av standarden, kan vilken text som helst kodas som en sekvens av Unicode-tecken

Hej U+041F U+0440 U+0438 U+0432 U+0435 U+0442

skriv ner det på ett papper, packa det i ett kuvert och skicka det till vilken del av jorden som helst. Om de känner till Unicodes existens kommer texten att uppfattas av dem på exakt samma sätt som vi gör med dig. De kommer inte att tvivla på att den näst sista karaktären är just den kyrilliska gemener e(U+0435) snarare än att säga latin liten e(U+0065). Lägg märke till att vi inte sa ett ord om byte-representation.

Unicode-kodutrymme

Unicode-kodutrymmet består av 1 114 112 kodpunkter från 0 till 10FFFF. Av dessa har endast 128 237 tilldelats värden av den nionde versionen av standarden. En del av utrymmet är reserverat för privat bruk, och Unicode Consortium lovar att aldrig tilldela värden till positioner från dessa specialområden.

För bekvämlighets skull är hela utrymmet uppdelat i 17 plan (sex av dem är för närvarande inblandade). Fram till nyligen var det vanligt att säga att du med största sannolikhet bara kommer att behöva hantera Basic Multilingual Plane (BMP), som inkluderar Unicode-tecken från U+0000 till U+FFFF. (Vi går vidare lite: tecken från BMP representeras i UTF-16 av två byte, inte fyra). Under 2016 är denna avhandling redan tveksam. Så till exempel kan populära Emoji-karaktärer mycket väl finnas i ett användarmeddelande och du måste kunna bearbeta dem korrekt.

Kodningar

Om vi ​​vill skicka text över Internet måste vi koda en sekvens av Unicode-tecken som en sekvens av byte.

Unicode-standarden innehåller en beskrivning av ett antal Unicode-kodningar, såsom UTF-8 och UTF-16BE/UTF-16LE, som gör att hela utrymmet av kodpunkter kan kodas. Konvertering mellan dessa kodningar kan utföras fritt utan förlust av information.

Dessutom har ingen avbrutit enkelbyte-kodningar, men de låter dig koda din egen individuella och mycket smala del av Unicode-spektrumet - 256 eller färre kodpositioner. För sådana kodningar finns tabeller och är tillgängliga för alla, där varje värde i en enskild byte är associerat med ett Unicode-tecken (se till exempel CP1251.TXT). Trots begränsningarna är enkelbyte-kodningar mycket praktiska när det gäller att arbeta med ett stort antal enspråkiga textinformation.

Av Unicode-kodningarna på Internet är UTF-8 den vanligaste (den vann handflatan 2008), främst på grund av dess ekonomi och transparenta kompatibilitet med sju-bitars ASCII. Latin- och tjänstesymboler, grundläggande skiljetecken och siffror - d.v.s. alla sjubitars ASCII-tecken är kodade i UTF-8 med en byte, samma som i ASCII. Symbolerna för många grundläggande skript, bortsett från några sällsynta hieroglyfiska tecken, representeras i det av två eller tre byte. Den största av kodpositionerna som definieras av standarden - 10FFFF - är kodad med fyra byte.

Observera att UTF-8 är en kodning med variabel längd. Varje Unicode-tecken i den representeras av en sekvens av kodkvanta med en minsta längd på ett kvantum. Siffran 8 betyder bitlängden för kodkvantumet (kodenheten) - 8 bitar. För UTF-16-kodningsfamiljen är storleken på kodkvantumet 16 bitar. För UTF-32 - 32 bitar.

Om du skickar en HTML-sida med kyrillisk text över nätverket kan UTF-8 ge en mycket påtaglig vinst, eftersom. all uppmärkning, såväl som JavaScript- och CSS-block, kommer effektivt att kodas i en byte. Till exempel huvudsida Habra i UTF-8 tar 139Kb, och i UTF-16 är det redan 256Kb. Som jämförelse, om du använder win-1251 med förlust av förmågan att spara vissa tecken, kommer storleken att minskas med endast 11Kb.

Applikationer använder ofta 16-bitars Unicode-kodningar för att lagra stränginformation på grund av deras enkelhet och det faktum att tecknen i världens stora skrivsystem är kodade i ett sextonbitars kvantum. Så till exempel använder Java framgångsrikt UTF-16 för intern representation av strängar. Operativ system Windows internt använder också UTF-16.

Hur som helst, så länge vi stannar i Unicode-utrymmet spelar det ingen roll hur stränginformationen lagras inom ramverket. separat ansökan. Om det interna lagringsformatet tillåter dig att korrekt koda alla mer än en miljon kodpositioner och det inte finns någon förlust av information vid applikationsgränsen, till exempel när du läser från en fil eller kopierar till klippbordet, är allt bra.

För att korrekt tolka text som läses från disk eller från ett nätverksuttag måste du först bestämma dess kodning. Detta görs antingen med hjälp av användartillhandahållen metainformation skriven i eller nära texten, eller bestäms heuristiskt.

I torrsubstansen

Det finns mycket information och det är vettigt att ge en kort sammanfattning av allt som skrevs ovan:

  • Unicode postulerar en tydlig skillnad mellan tecken, deras representation på en dator och deras visning på en utdataenhet.
  • Unicode-kodutrymmet består av 1 114 112 kodpunkter från 0 till 10FFFF.
  • Det grundläggande flerspråkiga planet innehåller Unicode-tecknen U+0000 till U+FFFF, som är kodade i UTF-16 som två byte.
  • Alla Unicode-kodningar låter dig koda hela utrymmet av Unicode-kodpositioner, och konvertering mellan olika sådana kodningar utförs utan att information går förlorad.
  • Enkelbyte-kodningar tillåter endast en liten del av Unicode-spektrumet att kodas, men kan vara användbart när du arbetar med stor volym enspråkig information.
  • UTF-8- och UTF-16-kodningar har variabel kodlängd. I UTF-8 kan varje Unicode-tecken kodas som en, två, tre eller fyra byte. I UTF-16, två eller fyra byte.
  • Det interna formatet för att lagra textinformation i en separat applikation kan vara godtyckligt, förutsatt korrekt funktion med hela utrymmet för Unicode-kodpunkter och ingen förlust av gränsöverskridande dataöverföring.

En snabb notering om kodning

Det kan finnas viss förvirring med termen kodning. Inom Unicode sker kodning två gånger. Första gången en Unicode-teckenuppsättning (teckenuppsättning) kodas, i den meningen att varje Unicode-tecken tilldelas en motsvarande kodposition. Som en del av denna process omvandlas Unicode-teckenuppsättningen till en kodad teckenuppsättning. Andra gången unicode-teckensekvensen konverteras till en bytesträng kallas denna process även för kodning.

I engelsk terminologi finns det två olika verb att koda och koda, men även modersmålstalare blir ofta förvirrade i dem. Dessutom används termen teckenuppsättning eller teckenuppsättning som en synonym för termen kodad teckenuppsättning.

Vi säger allt detta till det faktum att det är vettigt att vara uppmärksam på sammanhanget och skilja mellan situationer när det gäller kodpositionen för ett abstrakt Unicode-tecken och när det kommer till dess byte-representation.

Till sist

Det finns så många i Unicode olika aspekter att det är omöjligt att täcka allt inom ramen för en artikel. Ja, och onödigt. Ovanstående information är tillräckligt för att inte bli förvirrad i de grundläggande principerna och arbeta med text i de flesta vardagliga uppgifter (läs: utan att gå längre än BMP). I följande artiklar kommer vi att prata om normalisering, ge en mer fullständig historisk översikt över utvecklingen av kodningar, prata om problemen med ryskspråkig Unicode-terminologi och även göra material om praktiska aspekter använder UTF-8 och UTF-16.

Unicode är en internationell teckenkodningsstandard som tillåter att texter visas enhetligt på vilken dator som helst i världen, oavsett vilket systemspråk som används på den.

Grunderna

För att förstå vad en Unicode-teckentabell är till för, låt oss först förstå mekanismen för att visa text på en bildskärm. Datorn bearbetar som vi vet all information in digital form, och att visa det för korrekt uppfattning av en person bör vara i en grafik. För att vi ska kunna läsa den här texten måste vi alltså lösa minst två problem:

  • Koda utskrivbara tecken till digital form.
  • Ge operativsystemet möjligheten att matcha den digitala formen med vektortecken, med andra ord hitta rätt bokstäver.

Första kodningarna

Förfadern till alla kodningar anses vara den amerikanska ASCII. Den beskrev det latinska alfabetet som används på engelska med skiljetecken och arabiska siffror. Det var de 128 tecken som användes i den som blev grunden för efterföljande utvecklingar - även den moderna Unicode-teckentabellen använder dem. Sedan dess har bokstäverna i det latinska alfabetet upptagit de första positionerna i någon kodning.

Totalt tillät ASCII att lagra 256 tecken, men eftersom de första 128 var upptagna av det latinska alfabetet började de återstående 128 användas över hela världen för att skapa nationella standarder. Till exempel, i Ryssland skapades CP866 och KOI8-R på grundval av detta. Sådana varianter kallades utökade versioner av ASCII.

Kodsidor och "krakozyabry"

Ytterligare utveckling av teknik och uppkomsten av ett grafiskt gränssnitt ledde till att American Standards Institute skapade ANSI-kodningen. ryska användare, speciellt med erfarenhet, hennes version är känd under Windows namn 1251. Begreppet "kodtabell" användes först i den. Det var med hjälp av teckentabeller som innehöll symboler för andra nationella alfabet än latin som "ömsesidig förståelse" etablerades mellan datorer som används i olika länder.

Däremot närvaron ett stort antal olika kodningar som användes för samma språk började orsaka problem. Så kallad krakozyabry dök upp. De uppstod från en oöverensstämmelse mellan den ursprungliga teckentabellen där viss information skapades och teckentabellen som används som standard på slutanvändarens dator.

Som ett exempel kan de kyrilliska kodningarna CP866 och KOI8-R som nämns ovan nämnas. Bokstäverna i dem skilde sig åt i kodpositioner och placeringsprinciper. I den första arrangerades de i alfabetisk ordning, och i den andra - i godtycklig. Du kan föreställa dig vad som hände framför ögonen på en användare som försökte öppna sådan text utan att ha rätt teckentabell eller när den tolkades felaktigt av datorn.

Skapande av Unicode

Internets spridning och relaterade teknologier som t.ex E-post, ledde till att situationen med förvrängning av texter i slutändan upphörde att passa alla. Ledande IT-företag bildade Unicode Consortium ("Unicode Consortium"). Teckentabellen han introducerade 1991 under namnet UTF-32 gjorde att över en miljard unika tecken kunde lagras. Det var stort steg på väg att tyda texterna.

Den första universella teckenkodtabellen Unicode UTF-32 blev dock inte särskilt populär. Den främsta orsaken var redundansen av lagrad information. Det beräknades snabbt att för länder som använder det latinska alfabetet kodat med den nya universella tabellen, skulle texten ta upp fyra gånger så mycket utrymme som att använda den utökade ASCII-tabellen.

Utveckling av Unicode

Följande UTF-16 Unicode-teckentabell löste detta problem. Kodning i den utfördes med hälften av antalet bitar, men samtidigt antalet möjliga kombinationer. Istället för miljarder tecken sparar den bara 65 536 tecken. Ändå var den så framgångsrik att detta nummer, enligt konsortiet, definierades som det grundläggande lagringsutrymmet för Unicode-tecken.

Trots denna framgång passade inte UTF-16 alla, eftersom mängden lagrade och överförd information fortfarande fördubblats. One-Stop-lösning blev UTF-8, Unicode-teckentabellen med variabel längd. Detta kan kallas ett genombrott på detta område.

Med införandet av de två senaste standarderna har Unicode-teckentabellen löst problemet med ett enda kodutrymme för alla för närvarande använda typsnitt.

Unicode för ryska

På grund av den varierande längden på koden som används för att visa tecken, kodas latin i Unicode på samma sätt som i dess stamfader ASCII, det vill säga i en bit. För andra alfabet kan bilden se annorlunda ut. Till exempel använder tecknen i det georgiska alfabetet tre byte för kodning, och tecknen i det kyrilliska alfabetet använder två. Allt detta är möjligt inom ramen för att använda UTF-8 Unicode-standarden (teckentabell). Det ryska språket eller det kyrilliska alfabetet upptar 448 positioner i det gemensamma kodutrymmet, uppdelat i fem block.

Dessa fem block inkluderar de grundläggande kyrilliska och kyrkoslaviska alfabeten, såväl som ytterligare bokstäver från andra språk som använder det kyrilliska alfabetet. Ett antal positioner har tilldelats för att visa de gamla formerna för representation av kyrilliska bokstäver, och 22 positioner av det totala antalet är lediga än så länge.

Aktuell version av Unicode

Med lösningen av sin primära uppgift, som var att standardisera typsnitt och skapa ett enda kodutrymme för dem, slutade inte "Konsortiet" sitt arbete. Unicode utvecklas och expanderar ständigt. Sista aktuell version av denna standard 9.0 släpptes 2016. Den inkluderade ytterligare sex alfabet och utökade listan över standardiserade emojis.

Jag måste säga att för att förenkla forskning, till och med de så kallade döda språken har lagts till i Unicode. De fick detta namn för att det inte finns några människor som han skulle vara infödd för. Denna grupp inkluderar även språk som har kommit ner till vår tid endast i form av skrivna monument.

I princip kan vem som helst ansöka om att lägga till tecken till den nya Unicode-specifikationen. Det är sant, för detta måste du fylla i en anständig mängd källdokument och spendera mycket tid. Ett levande exempel på detta är berättelsen om programmeraren Terence Eden. 2013 lämnade han in en ansökan om att få ingå i specifikationen av symboler relaterade till beteckningen av datorströmkontrollknappar. V teknisk dokumentation de har använts sedan mitten av 1970-talet, men var inte en del av Unicode förrän specifikation 9.0.

tabell med symboler

Varje dator, oavsett vilket operativsystem som används, använder Unicode-teckentabellen. Hur använder man dessa tabeller, var man hittar dem och varför de kan vara användbara för en vanlig användare?

OS windows bord symboler finns i avsnittet "Verktyg" på menyn. i operationsfamiljen Linux-system det kan vanligtvis hittas i undersektionen "Standard" och i MacOS - i tangentbordsinställningarna. Huvudsyftet med denna tabell är att komma in textdokument tecken som inte finns på tangentbordet.

Applikationen för sådana tabeller kan hittas som bredast: från att ange tekniska symboler och ikoner för nationella monetära system till att skriva instruktioner för praktisk applikation tarotkort.

Till sist

Unicode används överallt och kom in i våra liv tillsammans med utvecklingen av Internet och mobil teknik. Tack vare dess användning har systemet för interetnisk kommunikation förenklats avsevärt. Vi kan säga att införandet av Unicode är ett betydelsefullt, men helt osynligt exempel på användningen av teknik för hela mänsklighetens gemensamma bästa.

Tro det eller ej, det finns ett bildformat inbyggt i webbläsaren. Detta format låter dig ladda ner bilder innan de behövs, ger rendering av bilden på normal eller näthinna skärmar och låter dig lägga till css-bilder. OK, det är inte helt sant. Detta är inte ett bildformat, även om allt annat fortfarande är giltigt. Med den kan du skapa upplösningsoberoende ikoner som inte tar någon tid att ladda och som är stilbara med använder CSS.

Vad är Unicode?

Unicode är förmågan att korrekt visa bokstäver och skiljetecken från olika språk på en sida. Det är otroligt användbart: användare kommer att kunna arbeta med din webbplats över hela världen och den kommer att visa vad du vill - det kan vara franska med diakritiska tecken eller Kanji .

Unicode fortsätter att utvecklas: nu är den nuvarande versionen 8.0, som har mer än 120 tusen tecken (i den ursprungliga artikeln som publicerades i början av 2014 handlade det om version 6.3 och 110 tusen tecken).

Förutom bokstäver och siffror finns det andra tecken och ikoner i Unicode. V senaste versionerna dessa inkluderade emoji, som du kan se i iOS Messenger.

HTML-sidor skapas från en sekvens av Unicode-tecken och konverteras till byte när de skickas över nätverket. Varje bokstav och varje symbol på något språk har sin egen unika kod och kodas när filen sparas.

När du använder UTF-8-kodningssystemet kan du infoga Unicode-tecken direkt i text, men du kan också lägga till Unicode-tecken till text genom att ange en numerisk symbolisk länk. Detta är till exempel en hjärtsymbol och du kan visa denna symbol genom att helt enkelt lägga till kod i markeringen.

Detta numerisk referens kan anges i både decimalt och hexadecimalt format. Decimalformatet kräver att bokstaven x läggs till i början, posten kommer att ge samma hjärta ( ) som föregående alternativ. (2665 är den hexadecimala versionen av 9829).

Om du lägger till ett Unicode-tecken med CSS kan du bara använda hexadecimala värden.

Några av de vanligaste Unicode-tecknen har mer minnesvärda textnamn eller förkortningar istället för numeriska koder, som et-tecken (& - &). Sådana symboler kallas mnemonics i HTML, deras fullständiga lista finns på Wikipedia.

Varför ska du använda Unicode?

Bra fråga, här är några anledningar:

  1. För att använda rätt tecken från olika språk.
  2. För att ersätta ikoner.
  3. För att ersätta ikoner anslutna via @font-face .
  4. För att ställa in CSS-klasser

Rätt tecken

Det första av skälen kräver inga ytterligare åtgärder. Om HTML-koden sparas i UTF-8-format och dess kodning överförs över nätverket som UTF-8, bör allt fungera som det ska.

Måste. Tyvärr stöder inte alla webbläsare och enheter alla Unicode-tecken på samma sätt (mer exakt, inte alla teckensnitt stöder hela uppsättningen tecken). Till exempel stöds inte nyligen tillagda emoji-tecken överallt.

För UTF-8-stöd i HTML5 lägg till (om du inte har tillgång till serverinställningarna bör du också lägga till ). Den gamla doctype använder ( ).

Ikoner

Det andra skälet till att använda Unicode är att det finns många användbara tecken som kan användas som ikoner. Till exempel , ≡ och .

Deras uppenbara fördel är att du inte behöver någon ytterligare filer för att lägga till dem på sidan, vilket innebär att din webbplats blir snabbare. Du kan också ändra deras färg eller lägga till en skugga med CSS. Och genom att lägga till övergångar (css-övergång) kan du smidigt ändra färgen på ikonen när du håller muspekaren över den utan några ytterligare bilder.

Låt oss säga att jag vill inkludera en betygsindikator med stjärnor på min sida. Jag kan göra så här:

★ ★ ★ ☆ ☆

Du får följande resultat:

Men om du har otur kommer du att se något sånt här:

Samma betyg på BlackBerry 9000

Detta händer om tecknen som används inte finns i webbläsarens eller enhetens teckensnitt (lyckligtvis stöds dessa asterisker perfekt och den gamla Blackberry telefonerär det enda undantaget här).

Om det inte finns något Unicode-tecken kan det ersättas med olika karaktärer från en tom ruta (□) till en diamant med ett frågetecken (�).

Men hur hittar du ett Unicode-tecken som kan vara lämpligt att använda i din design? Du kan slå upp det på en webbplats som Unicodinator genom att titta på de tillgängliga karaktärerna, men det finns också det bästa sättet. - den här fantastiska sidan låter dig rita ikonen du letar efter och ger dig sedan en lista med liknande Unicode-tecken.

Använda Unicode med @font-face-ikoner

Om du använder ikoner som är länkade till ett externt typsnitt via @font-face , kan Unicode-tecken användas som reserv. På så sätt kan du visa ett liknande Unicode-tecken på enheter eller webbläsare där @font-face inte stöds:

Vänster Teckensnitt ikoner Fantastiskt i Chrome, och till höger finns deras ersättnings Unicode-tecken i Opera Mini.

Många @font-face-matchningsverktyg använder Unicode-teckenintervallet från området för privat användning. Problemet med detta tillvägagångssätt är att om @font-face inte stöds skickas teckenkoder till användaren utan någon mening.

Perfekt för att skapa ikonuppsättningar i @font-face och låter dig välja ett lämpligt Unicode-tecken som grund för ikonen.

Men var försiktig - vissa webbläsare och enheter gillar inte enstaka Unicode-tecken när de används med @font-face . Det är vettigt att kontrollera Unicode-teckenstödet med Unify - den här appen hjälper dig att avgöra hur säkert det är att använda ett tecken i @font-face-ikonuppsättningen.

Stöd för Unicode-tecken

Det största problemet med att använda Unicode-tecken som reserv är dåligt stöd i skärmläsare (igen, viss information om detta finns på Unify), så det är viktigt att välja de tecken du använder noggrant.

Om din ikon bara är ett dekorativt element bredvid en textetikett som kan läsas av en skärmläsare, behöver du inte oroa dig för mycket. Men om ikonen är för sig själv är det värt att lägga till en dold textetikett för att hjälpa skärmläsare. Även om ett Unicode-tecken läses av en skärmläsare finns det en chans att det skiljer sig mycket från det avsedda syftet. Till exempel kommer ≡ (≡) som en hamburgerikon att läsas som "identisk" av VoiceOver på iOS.

Unicode i CSS-klassnamn

Att Unicode kan användas i klassnamn och i stilmallar har varit känt sedan 2007. Det var då som Jonathan Snook skrev om användningen av Unicode-tecken i hjälpklasser när man lägger ut rundade hörn. Denna idé har inte fått mycket spridning, men det är värt att veta om möjligheten att använda Unicode i klassnamn (specialtecken eller kyrilliska).

Val av teckensnitt

Få teckensnitt stöder hela Unicode-teckenuppsättningen, så se till att kontrollera de tecken du vill ha när du väljer ett teckensnitt.

Massor av ikoner i Segoe UI Symbol eller Arial Unicode MS. Dessa typsnitt är tillgängliga på både PC och Mac; Lucida Grande har också en hel del Unicode-tecken. Du kan lägga till dessa teckensnitt i teckensnittsfamiljens deklaration för att upprätthålla det maximala antalet Unicode-tecken för användare som har dessa teckensnitt installerade.

Fastställande av Unicode-stöd

Det skulle vara mycket bekvämt att kunna kontrollera förekomsten av ett visst Unicode-tecken, men det finns inget garanterat sätt att göra detta.

Unicode-tecken kan vara effektiva när de stöds. Till exempel, en emoji i ämnesraden i ett e-postmeddelande gör att den sticker ut från resten brevlåda.

Slutsats

Den här artikeln täcker bara grunderna i Unicode. Jag hoppas att du tycker att det är användbart och hjälper dig att bättre förstå Unicode och använda det effektivt.

Länklista

  • (Unicode-baserad @font-face ikonuppsättningsgenerator)
  • Shape Catcher (verktyg för teckenigenkänning av Unicode)
  • Unicodinator (unicode-teckentabell)
  • Unify (Se efter stöd för Unicode-tecken i webbläsare)
  • Unitools (Samling av verktyg för att arbeta med Unicode)

Unicode är en mycket stor och komplex värld, eftersom standarden låter dig representera och arbeta på en dator med alla de stora skripten i världen. Vissa skriftsystem har funnits i mer än tusen år, och många av dem har utvecklats nästan oberoende av varandra i olika delar av världen. Människor har kommit på så många saker och det är ofta så olika varandra att det var en oerhört svår och ambitiös uppgift att kombinera allt detta till en enda standard.

För att verkligen förstå Unicode måste du åtminstone ytligt föreställa dig funktionerna i alla skript som standarden tillåter dig att arbeta med. Men är det verkligen nödvändigt för varje utvecklare? Vi säger nej. För att använda Unicode i de flesta vardagliga sysslor räcker det att ha ett rimligt minimum av kunskap, och sedan fördjupa sig i standarden efter behov.

I den här artikeln kommer vi att prata om de grundläggande principerna för Unicode och lyfta fram de viktiga praktiska problem som utvecklare säkert kommer att möta i sitt dagliga arbete.

Varför behövs Unicode?

Före tillkomsten av Unicode användes enkelbyte-kodningar nästan universellt, där gränsen mellan tecknen själva, deras representation i datorminne och visning på skärmen var ganska villkorlig. Om du arbetade med ett eller annat nationellt språk, installerades motsvarande kodningsteckensnitt på ditt system, vilket gjorde att du kunde rita bytes från disken på skärmen på ett sådant sätt att de är meningsfulla för användaren.

Om du skrev ut en textfil på en skrivare och såg en uppsättning obegripliga krakozyabr på en papperssida, innebar detta att de lämpliga typsnitten inte laddades in i skrivaren och den tolkar byten inte som du skulle vilja.

Detta tillvägagångssätt i allmänhet och enkelbyte-kodningar i synnerhet hade ett antal betydande nackdelar:

  1. Det var möjligt att arbeta samtidigt med endast 256 tecken, och de första 128 var reserverade för latinska tecken och kontrolltecken, och under den andra halvan, förutom tecknen i det nationella alfabetet, var det nödvändigt att hitta en plats för pseudografiska tecken ( ╔ ╗).
  2. Typsnitten var knutna till en specifik kodning.
  3. Varje kodning representerade sin egen uppsättning tecken, och konvertering från en till en annan var endast möjlig med partiella förluster, när saknade tecken ersattes med grafiskt liknande.
  4. Det var svårt att överföra filer mellan enheter som kör olika operativsystem. Det var nödvändigt att antingen ha ett omvandlingsprogram eller att ta med ytterligare typsnitt tillsammans med filen. Existensen av Internet som vi känner det var omöjligt.
  5. Det finns icke-alfabetiska skriftsystem i världen (hieroglyfisk skrift), som i princip inte är representativa i en enbyte-kodning.

Grunderna i Unicode

Vi förstår alla mycket väl att datorn inte känner till några idealiska enheter, utan arbetar med bitar och bytes. Men datorsystem skapas fortfarande av människor, inte maskiner, och det är ibland bekvämare för dig och mig att arbeta med spekulativa koncept och sedan gå från det abstrakta till det konkreta.

Viktig! En av de centrala principerna i Unicodes filosofi är en tydlig skillnad mellan tecken, deras representation på en dator och deras visning på en utenhet.

Konceptet med ett abstrakt Unicode-tecken introduceras, som endast existerar i form av ett spekulativt koncept och en överenskommelse mellan människor, fastställd av standarden. Varje Unicode-tecken tilldelas ett icke-negativt heltal som kallas dess kodpunkt.

Så till exempel är Unicode-tecknet U+041F den stora kyrilliska bokstaven P. Det finns flera sätt att representera detta tecken i datorns minne, samt flera tusen sätt att visa det på skärmen. Men samtidigt P blir det P eller U + 041F i Afrika.

Detta är den välkända inkapslingen eller separationen av gränssnittet från implementeringen - ett koncept som har bevisat sig i programmering.

Det visar sig att, guidad av standarden, kan vilken text som helst kodas som en sekvens av Unicode-tecken

Hej U+041F U+0440 U+0438 U+0432 U+0435 U+0442
skriv ner det på ett papper, packa det i ett kuvert och skicka det till vilken del av jorden som helst. Om de känner till Unicodes existens kommer texten att uppfattas av dem på exakt samma sätt som vi gör med dig. De kommer inte att tvivla på att den näst sista karaktären är just den kyrilliska gemener e(U+0435) snarare än att säga latin liten e(U+0065). Lägg märke till att vi inte sa ett ord om byte-representation.

Även om Unicode-tecken kallas symboler, motsvarar de inte alltid ett tecken i traditionellt naiv mening, som en bokstav, siffra, skiljetecken eller hieroglyf. (Se nedan spoilern för mer information.)

Exempel på olika unicode-tecken

Det finns rent tekniska Unicode-tecken, till exempel:

  • U+0000: nolltecken;
  • U+D800–U+DFFF: mindre och större surrogat för teknisk representation av kodpunkter i intervallet 10000 till 10FFFF (läs: utanför BMYP/BMP) i UTF-16-kodningsfamiljen;
  • etc.
Det finns skiljetecken, såsom U+200F: höger-till-vänster riktningsändringsmarkör.

Det finns en hel kohort av utrymmen av olika bredder och syften (se en utmärkt habra-artikel:):

  • U+0020 (mellanslag);
  • U+00A0 ( icke-brytande utrymme, i HTML);
  • U+2002 (semi-space eller En Space);
  • U+2003 (em space eller em space);
  • etc.
Det finns kombinerbara diakritiska tecken(kombination av diakritiska tecken) - alla typer av slag, prickar, tilder, etc., som ändrar / förtydligar innebörden av den tidigare karaktären och dess stil. Till exempel:
  • U+0300 och U+0301: tecken på primär (akut) och sekundär (svag) stress;
  • U+0306: kort (överskrift), som i th;
  • U+0303: upphöjd tilde;
  • etc.
Det finns till och med sådana exotiska saker som språktaggar (U+E0001, U+E0020–U+E007E och U+E007F) som för närvarande är i limbo. De var tänkta som förmågan att markera vissa delar av texten som tillhörande en viss språkvariant (säg amerikansk och brittisk engelska), vilket kan påverka detaljerna i textvisningen.

Vad är ett tecken, hur skiljer sig ett grafemkluster (läs: uppfattas som en enda helbild av ett tecken) från ett Unicode-tecken och från ett kodkvantum, det får vi berätta nästa gång.

Unicode-kodutrymme

Unicode-kodutrymmet består av 1 114 112 kodpunkter från 0 till 10FFFF. Av dessa har endast 128 237 tilldelats värden av den nionde versionen av standarden. En del av utrymmet är reserverat för privat bruk, och Unicode Consortium lovar att aldrig tilldela värden till positioner från dessa specialområden.

För bekvämlighets skull är hela utrymmet uppdelat i 17 plan (sex av dem är för närvarande inblandade). Fram till nyligen var det vanligt att säga att du med största sannolikhet bara kommer att behöva hantera Basic Multilingual Plane (BMP), som inkluderar Unicode-tecken från U+0000 till U+FFFF. (Vi går vidare lite: tecken från BMP representeras i UTF-16 av två byte, inte fyra). Under 2016 är denna avhandling redan tveksam. Så till exempel kan populära Emoji-karaktärer mycket väl finnas i ett användarmeddelande och du måste kunna bearbeta dem korrekt.

Kodningar

Om vi ​​vill skicka text över Internet måste vi koda en sekvens av Unicode-tecken som en sekvens av byte.

Unicode-standarden innehåller en beskrivning av ett antal Unicode-kodningar, såsom UTF-8 och UTF-16BE/UTF-16LE, som gör att hela utrymmet av kodpunkter kan kodas. Konvertering mellan dessa kodningar kan utföras fritt utan förlust av information.

Dessutom har ingen avbrutit enkelbyte-kodningar, men de låter dig koda din egen individuella och mycket smala del av Unicode-spektrumet - 256 eller färre kodpositioner. För sådana kodningar finns tabeller och är tillgängliga för alla, där varje värde i en enskild byte är associerat med ett Unicode-tecken (se till exempel CP1251.TXT). Trots begränsningarna visar sig enkelbyte-kodningar vara mycket praktiska när det gäller att arbeta med ett stort utbud av enspråkig textinformation.

Av Unicode-kodningarna på Internet är UTF-8 den vanligaste (den vann handflatan 2008), främst på grund av dess ekonomi och transparenta kompatibilitet med sju-bitars ASCII. Latin- och tjänstesymboler, grundläggande skiljetecken och siffror - d.v.s. alla sjubitars ASCII-tecken är kodade i UTF-8 med en byte, samma som i ASCII. Symbolerna för många grundläggande skript, bortsett från några sällsynta hieroglyfiska tecken, representeras i det av två eller tre byte. Den största av kodpositionerna som definieras av standarden - 10FFFF - är kodad med fyra byte.

Observera att UTF-8 är en kodning med variabel längd. Varje Unicode-tecken i den representeras av en sekvens av kodkvanta med en minsta längd på ett kvantum. Siffran 8 betyder bitlängden för kodkvantumet (kodenheten) - 8 bitar. För UTF-16-kodningsfamiljen är storleken på kodkvantumet 16 bitar. För UTF-32 - 32 bitar.

Om du skickar en HTML-sida med kyrillisk text över nätverket kan UTF-8 ge en mycket påtaglig vinst, eftersom. all uppmärkning, såväl som JavaScript- och CSS-block, kommer effektivt att kodas i en byte. Till exempel tar huvudsidan för Habr i UTF-8 139Kb, och i UTF-16 är den redan 256Kb. Som jämförelse, om du använder win-1251 med förlust av förmågan att spara vissa tecken, kommer storleken, jämfört med UTF-8, att minskas med endast 11Kb till 128Kb.

Applikationer använder ofta 16-bitars Unicode-kodningar för att lagra stränginformation på grund av deras enkelhet och det faktum att tecknen i världens stora skrivsystem är kodade i ett sextonbitars kvantum. Så till exempel använder Java framgångsrikt UTF-16 för intern representation av strängar. Operations rum Windows-system internt använder även UTF-16.

Hur som helst, så länge vi stannar i Unicode-utrymmet spelar det ingen roll hur stränginformation lagras i en enda applikation. Om det interna lagringsformatet tillåter dig att korrekt koda alla mer än en miljon kodpositioner och det inte finns någon förlust av information vid applikationsgränsen, till exempel när du läser från en fil eller kopierar till klippbordet, är allt bra.

För att korrekt tolka text som läses från disk eller från ett nätverksuttag måste du först bestämma dess kodning. Detta görs antingen med hjälp av användartillhandahållen metainformation skriven i eller nära texten, eller bestäms heuristiskt.

I torrsubstansen

Det finns mycket information och det är vettigt att ge en kort sammanfattning av allt som skrevs ovan:
  • Unicode postulerar en tydlig skillnad mellan tecken, deras representation på en dator och deras visning på en utdataenhet.
  • Unicode-tecken motsvarar inte alltid ett tecken i traditionell naiv mening, som en bokstav, siffra, skiljetecken eller hieroglyf.
  • Unicode-kodutrymmet består av 1 114 112 kodpunkter från 0 till 10FFFF.
  • Det grundläggande flerspråkiga planet innehåller Unicode-tecknen U+0000 till U+FFFF, som är kodade i UTF-16 som två byte.
  • Alla Unicode-kodningar låter dig koda hela utrymmet av Unicode-kodpositioner, och konvertering mellan olika sådana kodningar utförs utan att information går förlorad.
  • En-byte-kodningar tillåter endast en liten del av Unicode-spektrumet att kodas, men kan vara användbart när man arbetar med en stor mängd enspråkig information.
  • UTF-8- och UTF-16-kodningar har variabel kodlängd. I UTF-8 kan varje Unicode-tecken kodas som en, två, tre eller fyra byte. I UTF-16, två eller fyra byte.
  • Det interna formatet för att lagra textinformation inom en viss applikation kan vara godtyckligt, förutsatt att det fungerar korrekt med hela utrymmet för Unicode-kodpositioner och att det inte sker några förluster under gränsöverskridande dataöverföring.

En snabb notering om kodning

Det kan finnas viss förvirring med termen kodning. Inom Unicode sker kodning två gånger. Första gången en Unicode-teckenuppsättning (teckenuppsättning) kodas, i den meningen att varje Unicode-tecken tilldelas en motsvarande kodposition. Som en del av denna process omvandlas Unicode-teckenuppsättningen till en kodad teckenuppsättning. Andra gången unicode-teckensekvensen konverteras till en bytesträng kallas denna process även för kodning.

I engelsk terminologi finns det två olika verb att koda och koda, men även modersmålstalare blir ofta förvirrade i dem. Dessutom används termen teckenuppsättning eller teckenuppsättning som en synonym för termen kodad teckenuppsättning.

Vi säger allt detta till det faktum att det är vettigt att vara uppmärksam på sammanhanget och skilja mellan situationer när det gäller kodpositionen för ett abstrakt Unicode-tecken och när det kommer till dess byte-representation.

Till sist

Det finns så många olika aspekter av Unicode att det är omöjligt att täcka allt i en artikel. Ja, och onödigt. Ovanstående information är tillräckligt för att inte bli förvirrad i de grundläggande principerna och arbeta med text i de flesta vardagliga uppgifter (läs: utan att gå längre än BMP). I följande artiklar kommer vi att prata om normalisering, ge en mer komplett historisk översikt över utvecklingen av kodningar, prata om problemen med ryskspråkig Unicode-terminologi och även göra material om de praktiska aspekterna av att använda UTF-8 och UTF- 16.

Unicode: UTF-8, UTF-16, UTF-32.

Unicode är en uppsättning grafiska symboler och hur man kodar dem för datorbehandling textdata.

Unicode tilldelar inte bara en unik kod till varje tecken, utan definierar också olika egenskaper denna karaktär, till exempel:

    teckentyp (versaler, liten bokstav, nummer, skiljetecken, etc.);

    teckenattribut (vänster till höger eller höger till vänster display, blanksteg, radbrytning, etc.);

    motsvarande versaler eller gemener (för gemener och stora bokstäver respektive);

    motsvarande numeriskt värde(för numeriska tecken).

    Standarder UTF(förkortning för Unicode Transformation Format) för att representera tecken:

UTF-16: Windows Setup, Acceleration, Vista FAQ använder UTF-16-kodning för att representera alla Unicode-tecken. I UTF-16 representeras tecken av två byte (16 bitar). Denna kodning används i Windows eftersom 16-bitars värden kan representera tecknen som utgör alfabeten för de flesta språk i världen, vilket gör att program kan bearbeta strängar snabbare och beräkna deras längd. Men 16 bitar är inte tillräckligt för att representera alfabetiska tecken på vissa språk. I sådana fall stöder UTE-16 "surrogat"-kodningar, vilket gör att tecken kan kodas i 32 bitar (4 byte). Det finns dock få applikationer som måste hantera karaktärerna i sådana språk, så UTF-16 är en bra kompromiss mellan att spara minne och enkel programmering. Observera att i .NET Framework är alla tecken kodade med UTF-16, så att använda UTF-16 i Windows-applikationer förbättrar prestandan och minskar minnesförbrukningen när strängar skickas mellan inbyggd och hanterad kod.

UTF-8: I UTF-8-kodning kan olika tecken representeras av 1,2,3 eller 4 byte. Tecken med värden mindre än 0x0080 komprimeras till 1 byte, vilket är mycket bekvämt för amerikanska tecken. Tecken som matchar värden i intervallet 0x0080-0x07FF omvandlas till 2-byte-värden, vilket fungerar bra med europeiska och Mellanöstern-alfabet. Tecken med större värden konverteras till 3-byte värden, vilket är praktiskt när du arbetar med centralasiatiska språk. Slutligen skrivs "surrogat"-par i 4-byte-format. UTF-8 är en extremt populär kodning. Det är dock mindre effektivt än UTF-16 om tecken med värden 0x0800 eller högre används ofta.

UTF-32: I UTF-32 representeras alla tecken av 4 byte. Denna kodning är bekväm för att skriva enkla algoritmer för att räkna upp tecken på vilket språk som helst som inte kräver bearbetning av tecken representerade av olika antal byte. Till exempel, när du använder UTF-32, kan du glömma "surrogat", eftersom alla tecken i denna kodning representeras av 4 byte. Uppenbarligen är UTF-32 långt ifrån idealisk när det gäller minnesanvändning. Så given kodning används sällan för att skicka strängar över nätverket och spara dem i filer. Som regel används UTF-32 som ett internt format för att representera data i ett program.

UTF-8

Inom en snar framtid kallas ett speciellt Unicode- (och ISO 10646)-format UTF-8. Denna "derivata" kodning använder strängar av byte av olika längder (från ett till sex) för att skriva tecken, som omvandlas till Unicode-koder med en enkel algoritm, med kortare strängar som motsvarar vanligare tecken. Den största fördelen med detta format är kompatibilitet med ASCII inte bara när det gäller kodvärden, utan också när det gäller antalet bitar per tecken, eftersom en byte räcker för att koda något av de första 128 tecknen i UTF-8 (även om, till exempel behöver kyrilliska bokstäver två byte).

UTF-8-formatet uppfanns den 2 september 1992 av Ken Thompson och Rob Pike och implementerades i Plan 9. Nu är UTF-8-standarden officiellt inskriven i RFC 3629 och ISO/IEC 10646 Annex D-dokument.

För webbdesigner denna kodning är av särskild vikt eftersom det är den som deklarerats som "standarddokumentkodning" i HTML sedan version 4.

Text som endast består av tecken mindre än 128 konverteras till vanlig ASCII-text när den skrivs i UTF-8. Omvänt, i UTF-8-text, representerar varje byte med ett värde mindre än 128 ett ASCII-tecken med samma kod. De återstående Unicode-tecknen representeras som sekvenser på 2 till 6 byte långa (faktiskt bara upp till 4 byte, eftersom koder större än 221 inte är planerade), där den första byten alltid är 11xxxxxx och resten är 10xxxxxx.

Enkelt uttryckt, i UTF-8-format, latinska tecken, skiljetecken och kontroll ASCII-tecken skrivs i US-ASCII-koder, och alla andra tecken är kodade med flera oktetter med den mest signifikanta biten 1. Detta har två effekter.

    Även om programmet inte känner igen Unicode, alltså brev, arabiska siffror och skiljetecken visas korrekt.

    I händelse av att latinska bokstäver och de enklaste skiljetecken (inklusive mellanslag) upptar en betydande mängd text, ger UTF-8 en vinst i volym jämfört med UTF-16.

    Vid första anblicken kan det verka som att UTF-16 är bekvämare, eftersom de flesta tecken i den är kodade i exakt två byte. Detta motverkas dock av behovet av att stödja surrogatpar, som ofta glöms bort när man använder UTF-16, och implementerar endast stöd för UCS-2-tecken.







2022 gtavrl.ru.