Символно кодиране

от Уикипедия, свободната енциклопедия
Направо към: навигация, търсене

Кодирането на символи е съответствието на дадена група от символи към друга група. Например, цифрите или електрическите сигнали, обикновено са проектирани така че да позволяват съхранението на текст в компютър или да позволяват изпращането на текст с помощта на различни медии (среди). Един от най-семплите и същевременно известни примери за кодиране на символите е Морзовата азбука, която кодира букви от латинската азбука в последователност от линии и точки, или къси и дълги натискания на бутон на телеграфа, с цел да се изпратят чрез устройството телеграф до другата (приемащата) страна. Друг пример е ASCII кодът, който кодира букви, цифри и други символи в двоични числа със 7-битова дължина.

История[редактиране | редактиране на кода]

Ранните примери за двоично кодиране включват Шифърът на Бейкън (Bacon's cipher), Брайловата азбука, Международните морски сигнални флагове и 4-цифреното кодиране на китайски йероглифи. Често срещани примери за системи за символно кодиране са Морзовата азбука , кода на Бодо, Американския стандартен код за обмен на информация ASCII.

Морзовата азбука е въведена през 40-те години на 19 век и се използва за кодиране на буквите от латинската азбука, арабските числа и някои символи. Осъществява се посредством серии от кратки и продължителни натискания на телеграфния ключ – тирета и точки.

Кодът на Бодо, пет-битово кодиране, е създадено от Емил Бодо през 1870 година, патентовано през 1874. Модифицирано е от Доналд Мъри през 1901 и стандартизирано като Международна Радио-телефонна Азбука No 2 през 1930.

Бинарното кодиране на числа (Binary- coded decimal - BCM) на IBM e шест- битова система за кодиране използвана от IBM още през 1959 в техните компютри 1401 и 1620 и в тези серия 7000.

ASCII е въведена през 1963 година и представлява 7- битова кодираща система използвана да кодира букви, числа, символи.

Ограниченията на тези символни модели скоро станали очевидни и в последствие се появили нови методи, които да ги допълнят. Нуждата да се поддържат повече системи за писане за различните езици наложило поддръжката на много по- голям брой символи. Това изискало по- систематичен подход за кодиране на символите.

Дилемата, пред която били поставени изследователите в тази област през 80-те години на 20 век, когато опитвали да създадат универсален метод за символно кодиране, била от една страна нуждата да се добавят повече битове, за да се кодират допълнителните символи. От друга страна за потребителите на относително малкия сет от символи в Латинската азбука (които представлявали по- голямата част от потребителите на компютри по това време), тези допълнителни битове били огромна загуба на и без това оскъдните компютърни ресурси.

Компромисното решение, което било постигнато с Уникод (Unicode), разбило дългогодишното предположение, че всеки символ трябва винаги да кореспондира директно с определен модел от кодиращи битове. Обяснено по долу.

Кодова единица[редактиране | редактиране на кода]

Символ / знак

Терминология, свързана с кодовите единици:

  • Символът (знакът) е минимална единица текст, който има семантична стойност.
  • Наборът от символи представлява колекция от символи, които биха могли да бъдат използвани от различни езици.

Пример: Латинският набор от символи се използва от английския език и повечето европейски езици, въпреки че гръцкият набор от символи се използва само от гръцкия език.

  • Кодираният набор от символи е набор от символи, където всеки символ получава уникален номер.
  • Кодовата точка е стойност, която може да се използва в кодиран набор от символи. Кодовата точка е 32-битов целочислен тип данни, където по-ниските 21 бита представляват валидна стойност на кодова точка и горните 11 бита са 0.

Кодовата единица е последователност от битове, използвана за кодиране на всяка отделна символна единица, която е част от репертоар в рамките на всеки вид кодиране.

Символен репертоар (абстрактен списък от символи):

Репертоарът от символи предстсвлява абстрактен списък от повече от един милион открити скриптове, включително латински, кирилица, китайски, корейски, японски, иврит и арамейски символи.

Други символи като музикалните ноти например, също са включени в символния репертоар. И двата формата - Unicode и GB18030 имат символен репертоар. Когато нови символи са добавени към един формат, друг формат ги добавя също, с цел да се поддържа подобие на първия.

Размерът на кодовата единица се равнява на битовете за конкретния формат на кодиране:

  • Кодова единица според US-ASCII формата се състои от 7 бита;
  • Кодова единица според UTF-8, EBCDIC и GB18030 формата се състои от 8 бита;
  • Кодова единица според UTF-16 формата се състои от 16 бита;
  • Кодова единица в UTF-32 формата се състои от 32 бита.

Пример за кодова единица: Представете си един String (бълг.: низ от символи), който съдържа "abc", последван от Deseret LONG I, който е представен с две символни стойности. Този символен низ съдържа четири знака, четири кодови точки, но като цяло пет кодови единици.

За да изразите символ (знак) в Unicode, за шестнадесетичната стойност се добавя е началото представка на низа U +. Валидният обхват на кодовата точка за формата Unicode варира от U + 0000 до U + 10FFFF, включително.

Символи, които са в диапазона от U + 10 000 до U + 10FFFF се наричат ​​допълващи знаци (англ.: supplementary characters)

Наборът от символи от U + 0000 до U + FFFF понякога се отнасят до Основната Многоезична равнина (англ.: Basic Multilingual Plane - BMP).

Таблицата по-долу демонстрира примери за стойности на кодови точки:

Символ

Unicode кодова точка

Релефен символ

Латинския символ (знак) А

U+0041

Α

Латински sharp S символ

U+00DF

ß
Han for East U+6771
Ampersand U+0026 &
Inverted exclamation mark U+00A1 ¡
Section sign U+00A7 §

Връзката между кодовите точки и кодовите единици:

Кодовата точка е символ (знак) и се представя с една или повече кодови единици в зависимост от формата на кодирането.

Кодовите точки се картират в една или повече кодови единици във всеки формат за кодиране.

Броят на кодови единици изисква да бъде картиран към кодова точка в зависимост от формата на кодиране:

  • UTF-8

Множеството кодови единици на една кодoва точка са често срещани в UTF-8, поради по-малките размери на кодовите единици. Кодовите точки ще бъдат картирани с една, две, три, или четири кодови единици.

  • UTF-16

UTF-16 кодовите единици са два пъти по-големи от 8-битовите кодови единици. Ето защо, всички кодови точки със скаларна стойност по-малка от 10 000 U + е кодирана с единична кодова единица.

За кодовите точки със скаларна стойност U + 10 000 или по-висока, са необходими две кодови единици за една кодова точка. За тези двойки кодови единици съществува уникален термин в UTF-16: "Unicode сурогатни двойки".

  • UTF-32

32-битовата кодова единица, използвана в UTF-32 е достатъчно голяма, за да позволява на всяка кодова точка да се кодира като единична кодова единица.

  • GB18030

Множество кодови единици на една кодова точка са често срещани в GB18030, поради по-малките кодови единици. Кодовите точки ще бъдат съпоставени с една, две или четири кодови единици.


Уникод кодиращ модел[редактиране | редактиране на кода]

Уникод или Универсален набор от символи (на английски: Unicode) и паралелния му стандарт ISO/IEC 10646 Universal Character Set, заедно представляват модерна единна система за символно кодиране. Вместо символите да се свързват директно в байтове, те поотделно определят какви символи са свободни, тяхното подреждане, как тези числа са кодирани като серия от „кодови единици”, и как накрая как  тези единици са кодирани като поток от байтове. Идеята за това разлагане е да се създаде универсален набор от символи, които могат да  бъдат кодирани по различен начин. За да се опише този модел правилно, трябва да се въведат по-точни методи от „набор от символи” и „символно  кодиране”. Методите, които се използват в съвременния модел са:

Символното съдържание е пълният набор от абстрактни символи, които една система поддържа. Съдържанието може да бъде затворено, т.е. не са позволени допълнения без създаване на нови стандарти (както е направена ASCII таблицата), или да бъде отворено, позволявайки допълнения. Символите в дадено съдържание отразяват решенията как да се разделят системите за писане на основни информационни единици. Основните варианти на латински, гръцки и  кирилица могат да бъдат разделени на букви, цифри, пунктуационни знаци и няколко специфични символи като празно място, които  могат да бъдат подредени в прости линейни последователности, които се показват в реда, в който се четат. Дори с тези азбуки, диакритични знаци представляват усложнение: те могат да се разглеждат или като част от отделен символ, който съдържа буква и диакритичен символ, или като отделни символи. Основният позволява много по-проста текстова обработка, а последният позволява да бъде използвана буквена/ диакритична комбинация. Лигатурите създават същите проблеми. Други системи за писане като арабската азбука или иврит са представени като по сложни символни съдържания, поради необходимостта да се акомодират неща като двупосочен текст и знаци, които са свързани по между си по различни начини.

Кодирания символен низ отговаря на това как е представено съдържанието на символите като цели числа, наречени кодови точки. Като например в дадено съдържание, символ представен с главна буква „А”, в латинската азбука е представен като числото 65.

Кодираната символна форма- КСФ (character encoding form- CEF) уточнява превръщането на целочислени кодове на кодиран набор от символи в серия от ограничени по размер целочислени кодови стойности, които улесняват съхранението в една система, представляваща числа в двоична бройна система, използвайки фиксиран брой битове. Например система, която съхранява информация в 16-битов блок, ще може да събере единствено цели числа от 0 до 65 535 във всяка единица. По-големите числа могат да бъдат представени, ако бъде използван повече от един 16-битов блок. Това е, което на КСФ побира: той определя начин на нанасяне единичен код на точка от редица например 0-1400000, до серия от един или повече кодови стойности от диапазона 0 до 65 535.

Най-простата КСФ система е просто да се изберат достатъчно големи единици, така че стойностите от кодирания набор от символи да могат да се кодират директно. Това работи добре за кодирани набори от символи, които се вписват в 8-бита и сравнително добре за кодирани набори от символи, които се побират в 16-бита. Въпреки това, тъй като размерът на кодиран набор от символи се увеличава, това става все по-малко ефективно и е трудно да се адаптират съществуващите системи, да се използват по-големи кодови стойности. Ето защо повечето система работещи с по-нови системи на Уникод използват или UTF-8 или UTF-16.

На следващо място е схемата за кодиране на символи- СКМ (character encoding scheme- CES). Тя уточнява как целочислени кодови стойности да бъдат вмъкнати в базирана файлова система. С Уникод една проста схема за кодиране на символи се използва в повечето случаи, просто като се уточни  дали байта за всяко число трябва да бъде в по-голям къс или в по-малък.

И накрая, може да има по-висок по ниво протокол, който предоставя допълнителна информация, която може да се използва, за да  се избере конкретен вариант на Уникод символ.

Символни модели, кодови страници и кодиране[редактиране | редактиране на кода]

Важно е ясно да разганичим концепциите между символен модел и символно кодиране.

Кодираният символен модел е множество от символи, всеки символ имащ уникален номер.  Единиците от кодираните символни модели се наричат кодови точки. Стойността на една кодова точка представлява позицията на символа в кодирания символен сет (модел). За пример, кодът на буквата à в Уникод символен модел е 255 в десетична или Е1 в шестнадесетична бройна система.

Кодираните символни модели биват наричани понякога кодови страници.

Символното кодиране рефлектира начина, по който кодираните символни модели (множества) са преведени в битове за манипулация в компютъра. Картинката показва как символите и символните точки в скрипта Tifinagh (Berber) са преведени до поредица от битове в паметта използвайки UTF-8 кодиране. Стойността на кодовата точка за всеки символ е зададена непосредствено под всеки символ на картинката. Стрелките показват как са преведени в поредица от битове, където всеки бит е представен от двуцифрено шестнадесетично число. Забележете как на дадения пример кодовите точки на скрипта Tifinagh(Berber) са представени в три битови, а удивителния знак е представен с един бит.

Един символен модел, няколко кодирания. Много стандарти в символните кодирания, като тези в ISO 8859 сериите използват един бит за даден символ и кодирането се извършват директно, тоест позицията на символа отговаря на кодирания символ. За пример буквата А в ISO 8859-1 кодиран символен модел е 65-та подред (започващ от 0) и кодирана е представена на компютъра като байт използващ стойността 65. За ISO 8859-1 това не се променя.

За Уникод обаче нещата не са директни. Всъщност кодовата точка за буквата à в модела Уникод е винаги 225 (в десетична бройна система), в UTF-8 буквата е представена в компютъра в два бита. В допълнение в Уникод има различни на брой начини за кодиране на един и същ символ. За пример буквата à може да бъде представена като 2 бита в едно кодиране и като 4 байта в друго. Кодиращите форми които могат да се използват в Уникод са UTF-8, UTF-16 и UTF-32.

Превод на кодирането[редактиране | редактиране на кода]

Като резултат от многото кодиращи методи (и нуждата от съвместимост с архивираните данни), които се използват, много компютърни програми са разработени, за да превеждат данните между различните кодиращи методи – това е своеобразно декодиране.

Междуплатформени програми[редактиране | редактиране на кода]

  • Уеб браузъри – най-модените уеб браузъри имат вградена детекция за кодиращите методи. На firefox3, примерно, това е менюто View/Character Encoding.
  • Iconv – програма и стандартизиран приложно-програмен интерфейс за преобразуване на кодирането.
  • luit – програма, която конвертира кодирането на входящи и изходящи данни до програми, които работят интерактивно.
  • convert_encoding.py – програма, базирана на python, за конвертиране на текстови файлове между различни кодирания.
  • decodeh.py – алгоритъм и модул за евристично разпознаване на кодирането на един низ от символи.
  • International Components for Unicode – колекция от C и Java библиотеки, които извършват конвертиране на символите.
  • Chardet – това е кодът на Mozilla за автоматично разпознаване на кодирането, написан на Python.
  • По-новите версии на file командата при Unix имат също функция за разпознаване на кодирането.
  • charset – C++ библиотека с прост интерфейс за преобразуване на кодирането между потоци на C++.

Unix програми[редактиране | редактиране на кода]

  • cmv – просто проложение за транскодиране на имена на файлове.
  • convmv – конвертира име на файл от едно кодиране към друго.
  • Cstocs – конвертира съдържание на файлове от едно кодиране на друго за Чешки и Словашки езици.
  • enca – анализира кодирането на предварително зададени текстови файл-ове.
  • recode – конвертира съдържанието на файл-а от едно кодиране към друго.
  • utrac – конвертира съдържанието на файл-а от едно кодиране към друго.

 Windows програми[редактиране | редактиране на кода]

  • Encoding.Convert – .NET приложно-програмен интерфейс.
  • MultiByteToWideChar/WideCharToMultiByte – конвертира от ANSA към Unicode и от Unicode kym ANSI.
  • cscvt – служи за конвертиране на колекции от символи.
  • enca – анализира кодирането на предварително зададени текстови файл-ове.

Използвани ресурси[редактиране | редактиране на кода]

  1. https://en.wikipedia.org/wiki/Character_encoding
  2. http://www.joelonsoftware.com/articles/Unicode.html
  3. http://www.w3.org/International/articles/definitions-characters/

Вижте още[редактиране | редактиране на кода]

  1. The Definitive Guide to Web Character Encoding
  2. Character encodings in HTML
  3. Understanding Big and Little Endian Byte Order