Кодиране на текст разберете как d; Unicode - Buzut
След като вече знаем нуждата от Unicode и нейната история, нека разгледаме техническите подробности. Казахме, че консорциумът стандартизира няколко кодировки, така че какви са те и как работят ?
Тъй като тези кодировки са много популярни, имената им са ви познати, особено след като вече ги споменахме в предишни глави. Това са UTF-n кодирания. Разликата между тези кодировки е минималната дължина на байтовете, необходима за представяне на символ.
Казахме, че първоначално Unicode е всичко в два байта. Тъй като повечето латински езици използват много малко не-ASCII знаци, това е недопустимо загуба на пространство за мнозина.
От друга страна, за езици, използващи знаци, които не са част от ASCII, тези кодировки са много полезни. Така че трябваше да намерим решение, което да подхожда на всички. Така че в Unicode кодовите точки и кодирането са две много различни неща.
Таблицата Unicode
Unicode е преди всичко гигантска таблица, присвояваща уникален номер на всеки символ, неговата кодова точка или кодова точка. Таблицата Unicode ви позволява да присвоите 1,114,112 (2 16 x 17) кодови точки. Само 25% от тези кодови точки се присъждат днес.
Тази таблица е разделена на 17 равнини (от 0 до 16) от по два байта, или 65 536 кодови точки на равнина (65 536 x 17 = 1,114 112). Тези планове позволяват лесно да се определят групи от знаци. На преден план, наречен Основна многоезична равнина (BMP) или Основният многоезичен план обединява 65k най-често срещаните знаци. Планове от 1 до 16 се наричат допълнителни планове.
Освен това говоренето за „Unicode кодиране“ всъщност няма смисъл. Например в Unicode, „здравей“ се превежда на:
Това са кодовите точки на Unicode, които съответстват на различните букви на думата. Както можете да видите, кодовите точки се изразяват в шестнадесетичен знак. Въпреки че обикновено се изразяват по този начин, те могат да бъдат представени и чрез десетичния им еквивалент.
HTML също позволява и двете нотации.
Можете да тествате това с HTML кодера. Различните знаци и свързаните кодови точки са изброени на сайта на Unicode Table.
Тези кодови точки, независимо дали са изразени в шестнадесетична, десетична или двоична, не са достатъчни за кодиране на знак в неговото двоично представяне.
Кодиране
Дотогава имаме само един начин да съпоставим знак и неговия номер в таблицата Unicode. Не ни казва как да съхраняваме тези елементи в паметта. Тук влизат кодировките.

Кодиране с фиксиран размер
Тези кодирания имат предимството, че са лесни за синтактичен анализ и търсене, както и за съкращаване, защото какъвто и да е характерът, неговият размер е известен предварително. Картографирането на двоични към кодови точки става лесно. Това обаче се прави за сметка на използваното пространство (RAM, диск, честотна лента и т.н.).
В ранните дни на Unicode, както видяхме, всичко се съхраняваше в два байта. Това кодиране, макар и оттеглено, все още съществува, нарича се UCS-2 и е с фиксирана дължина. Не позволява да се представят всички Unicode символи, а само първите 65k, които са най-често срещаните (без емотикони обаче).
Следователно нашето „здравей“ може да се съхранява в паметта, както следва (представяне в шестоъгълник).
Но както споменахме, на машина в малко-ендиански, байта ще бъдат обърнати.
Примерът илюстрира ненужното използване на пространство, тъй като всичко се съхранява в два байта, ако се използват само ASCII символи - и дори за някои латински символи като ударени букви, един байт се губи на символ.
Сега, ако разгледаме представянето на знака "€", двата байта се използват правилно.
От друга страна, всички знаци, които са извън BMP, т.е. 65536 най-често срещаните знаци, не могат да бъдат представени в UCS-2. Ето защо това кодиране не е част от стандарта Unicode днес.
UTF-32
Това кодиране е най-дългото кодиране с фиксиран размер от стандарта Unicode и също е единственият с фиксиран размер, който не е амортизиран. Използва се за представяне на всички Unicode символи на 32 бита или четири байта. Вземаме предишния си пример и го кодираме в UTF-32BE.
Тук изгубеното пространство е просто умопомрачително. Дори емотиконите не заемат толкова много място, ето пица 🍕 в UTF-32BE.
Предимството на това кодиране е да има всички знаци с еднакъв размер. За тази цел той почти никога не се използва за съхраняване на текст, а по-скоро служи във вътрешни API. Например Python 3 го използва за представяне на текстови променливи.
Кодиране с променлив размер
В днешно време, две кодирания с променлив размер са в стандарта Unicode, UTF-8 и UTF-16. Максимумът им е четири байта, но минималният размер на знак е съответно един и два байта.
Това е може би най-широко използваното кодиране днес. Както за съхранение, така и за прехвърляне на информация. Минималният му размер е осем бита и може да достигне до четири байта за някои знаци.
UTF-8 също има разликата да бъде напълно обратно съвместим с ASCII. Всеки валиден ASCII знак е валиден UTF-8 знак. Освен това, тъй като се състои от еднобайтови думи, той не е чувствителен към ендиан.
Тъй като това е кодиране с променлив размер, някои знаци са съставени от множество думи. За да може да се идентифицира броят на думите, съставляващи символ, UTF-8 поставя тази информация в първия байт.
- всяка кодова точка със стойност по-малка от 128 е кодирана в един байт с най-значимия бит при нула (както в ASCII),
- останалите кодови точки са кодирани в няколко байта. Първият байт има своите най-значими битове на 1 с толкова 1s, колкото има думи. Така че имаме минимум две и до четири 1, последвани от 0, докато останалите битове се използват за кодиране на информацията. Следващите думи трябва да започват с 10 .
| 1 | 0xxxxxxx |
| 2 | 110xxxxx 10xxxxxx |
| 3 | 1110xxxx 10xxxxxx 10xxxxxx |
| 4 | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
Нека да видим това с някои конкретни примери. Буквата „e“ е кодирана както в ASCII. Или 65hex или 101dec, това дава 01100101bin. Засега е много просто.
Сега да вземем емоджи 😎 като пример. Ако разгледаме таблицата на Unicode, осъзнаваме, че нейният код е U + 1F60E или 128526dec. Ако обаче разгледаме подробностите за кодирането, както шестнадесетичното, така и десетичното представяне не съответстват.
За да си възвърнем стойността, трябва да разберем кодирането, обяснено по-горе. Нека да видим това в детайли.
UTF-16
UTF-16 е с променлива дължина с 16-битови думи. По този начин в UTF-16 знакът е или два, или четири байта. За разлика от UTF-8, UTF-16 не е съвместим с ASCII - и разбира се не е съвместим и с UTF-8.