Основно съдържание
Компютрите и интернет
Курс: Компютрите и интернет > Раздел 1
Урок 5: Съхранение на текст в двоичен видСъхранение на текст в двоичен вид
Компютрите съхраняват не само числа в двоичен вид. Но как двоичните числа могат да представят не-числови данни като букви и символи?
Оказва се, че това, което е нужно, е малко помощ от човека. Трябва да се уговорим да използваме кодови таблици – съответствия между символ и двоично число.
Просто кодиране
Например – как бихме записали в двоичен вид следните символи?
☮️❤️😀
Можем да изобретим тази проста кодова таблица:
Двоично | Символ\n- | - | -\nstart text, 0, end text, start text, 1, end text\t| ☮️\nstart text, 10, end text\t| ❤️\nstart text, 11, end text\t| 😀
Да я наречем "HPE кодова таблица". Удобно е да даваме имена на кодовите таблици, за да могат програмистите да са сигурни, че използват едни и същи такива.
Ако компютърна програма трябва да запише символа ❤️ в компютърната памет, тя може да запише start text, 10, end text вместо това. Когато програмата трябва да покаже start text, 10, end text на потребителя, тя може да си припомни "HPE кодовата таблица" и вместо това да покаже❤️.
Често компютърните програми и файлове трябва да съхраняват множество символи. Могат да го постигнат, като подреждат кодовете на символите един след друг.
Дадена програма може да запише файл с наименование "msg.hpe", съдържаща следните данни:
Програма на друг компютър, която разбира "HPE кодовата таблица", може след това да отвори "msg.hpe" и да покаже последователността от символи.
"HPE кодовата таблица" използва само 2 бита, което ограничава броя на символи, които може да представи.
С повече битове кодова таблица може да представи достатъчно букви, за да могат компютрите за съхраняват съобщения, документи и уеб страници.
ASCII кодова таблица
ASCII е била една от първите стандартизирани кодови таблици. Била е изобретена през 60-те години на XX век, когато телеграфията е била основната форма за комуникация на далечни разстояния, но все още се използва в модерните компютърни системи. start superscript, 1, end superscript
Телетипистите печатали съобщения на телепринтери като този:
Телепринтерът използвал ASCII стандарта, за да кодира всеки отпечатан символ в двоичен вид и след това да съхрани или изпрати двоичните данни.
Тази страница от инструкции за телепринтер от 1972 показва 128 ASCII кода:
Всеки ASCII символ е кодиран в двоичен вид чрез 7 бита. В таблицата по-горе заглавието на колоната показва първите 3 бита, а редът показва последните 4 бита. Първоначалният символ е "NUL", кодиран като start text, 0, end text, start text, 0, end text, start text, 0, end text, start text, 0, end text, start text, 0, end text, start text, 0, end text, start text, 0, end text.
Първите 32 кода представляват "контролни символи" – символи, които предизвикват някакъв ефект, вместо да отпечатат буква. "BEL" (кодирано в двоичен вид като start text, 0, end text, start text, 0, end text, start text, 0, end text, start text, 0, end text, start text, 111, end text) предизвиква звуков сигнал. "ENQ" (кодирано като start text, 0, end text, start text, 0, end text, start text, 0, end text, start text, 0, end text, start text, 101, end text) представлява заявка получаващата станция да се идентифицира.
Първоначално контролните символи са създадени за телепринтери и телеграфия, но впоследствие предназначението на много от тях е било променено за модерни компютри и интернет – особено "CR" и "LF". "CR" (start text, 0, end text, start text, 0, end text, start text, 0, end text, start text, 1101, end text) представя инструкцията за телепринтери "carriage return", която връща печатащата глава в началото на реда. "LF" (start text, 0, end text, start text, 0, end text, start text, 0, end text, start text, 1010, end text) представя инструкцията "line feed", която премества печатащата глава един ред надолу. Модерните интернет протоколи, като HTTP, FTP и SMTP, използват комбинацията от "CR" + "LF", за да представят "нов ред".
Останалите 96 ASCII символи изглеждат много по-познати.
Това са първите 8 главни букви от латиницата:
Двоично | Символ\n- | - | -\nstart text, 10, end text, start text, 0, end text, start text, 0, end text, start text, 0, end text, start text, 0, end text, start text, 1, end text | A\nstart text, 10, end text, start text, 0, end text, start text, 0, end text, start text, 0, end text, start text, 10, end text | B\nstart text, 10, end text, start text, 0, end text, start text, 0, end text, start text, 0, end text, start text, 11, end text | C\nstart text, 10, end text, start text, 0, end text, start text, 0, end text, start text, 10, end text, start text, 0, end text | D\nstart text, 10, end text, start text, 0, end text, start text, 0, end text, start text, 101, end text | E\nstart text, 10, end text, start text, 0, end text, start text, 0, end text, start text, 110, end text | F\nstart text, 10, end text, start text, 0, end text, start text, 0, end text, start text, 111, end text | G\nstart text, 10, end text, start text, 0, end text, start text, 10, end text, start text, 0, end text, start text, 0, end text | H
Използвайки стандарта ASCII, можем да кодираме 4-буквено съобщение в двоичен вид:
Само че има няколко проблема с ASCII кодовата таблица.
Първият голям проблем е, че ASCII съдържа само букви от английската азбука и ограничен набор от символи.
Език, който използва по-малко от 128 символа, може да създаде своя версия на ASCII, за да кодира текст, който е само в този език, но не и текстов файл със символи от различни езици. ASCII не може да кодира низ като: "Hello, José, would you care for Glühwein? It costs 10 €".
А какво да кажем за езици с хиляди логограми? ASCII не може да кодира достатъчно логограми, за да покрие изречение на китайски като "你好,想要一盘饺子吗?十块钱。"
Другият проблем с ASCII кодовата таблица е, че използва 7 бита, за да представи всеки символ, докато компютрите обикновено съхраняват информацията в байтове – комбинации от по 8 бита, а програмистите не обичат да пилеят компютърна памет.
Когато най-ранните компютри започнали да използват ASCII, за да кодират символи, за различните компютри се измислили различни начини да се ползва този последен бит. Например HP компютрите използвали осмия бит, за да представят символи, използвани в европейските държави (например "£" и "Ü"), компютрите TRS-80 го използвали за цветни графики, а компютрите Atari го използвали за негативни (бяло на черен фон) версии на първите 128 символа. squared
Резултатът? Файл, създаден с ASCII в едно приложение може да изглежда доста странно, когато се отвори с друго приложение, съвместимо с ASCII.
Компютрите имали нужда от нова кодова таблица. Кодова таблица, базирана на 8 бита, която може да представи всички езици по света.
Unicode (Юникод)
Но преди това – колко символа са ти необходими, за да представиш всички езици по света? Кои символи са на практика еднакви в различните езици, дори и да звучат по различен начин?
През 1987 група компютърни инженери се опитали да отговорят на тези въпроси. В крайна сметка те създали Unicode (Юникод) - универсален набор от символи, който задава "кодова точка" (шестандесетично число) и наименование на всеки символ.cubed
Например символът "ą" се обозначава с "U+0105" и се нарича "Латинска малка буква а с опашка". Символ, приличащ на "ą", съществува в 13 езика, като полски и литовски. Ето защо, според Юникод, символът "ą" в полската дума "robią" и "ą" в литовската дума "aslą" са еднакви. Юникод спестява място като обединява символи от различни езици.
И все пак има толкова много символи за кодиране. Наборът от символи Юникод стартира със 7129 именувани символа през 1991 г. и нараства до 137 929 именувани символа до 2019 г. Болшинството от тези символи описват логограми от китайски, японски и корейски, като "U+6728", който представя "木". Включени са също така и над 1200 символа за емоджи ("U+1F389" = "🎉"). start superscript, 4, end superscript
Юникод е набор от символи, но не е кодова таблица. За щастие, друга група инженери се справили с проблема ефективно кодиране на Юникод в двоичен вид.
UTF-8
През 1992 г. компютърни инженери изобретили UTF-8 – кодова таблица, която е съвместима с кодовата таблица ASCII, но в същото време разрешава проблемите ѝ. start superscript, 5, end superscript
UTF-8 може да опише всеки символ от стандарта Юникод, като използва 1, 2, 3 или 4 байта.
Когато компютърна програма чете UTF-8 текстов файл, тя разбира колко байта представят следващия символ от това колко бита от
1
намира в началото на байта.Брой байтове | Байт 1 | Байт 2 | Байт 3 | Байт 4 |
---|---|---|---|---|
1 | 0xxxxxxx | |||
2 | 110xxxxx | 10xxxxxx | ||
3 | 1110xxxx | 10xxxxxx | 10xxxxxx | |
4 | 11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx |
Ако няма битове с
1
в префикса (ако първият бит е 0
), това показва, че символът е представен с един байт. Оставащите 7 бита от байта се използват, за да бъдат представени оригиналните 128 ASCII символи. Това означава, че последователност от 8-битови ASCII символи е също и валидна UTF-8 последователност.Два байта, започващи с
110
, са използвани, за да се кодира остатъкът от символи в езиците, използващи латиница (например испански, немски), както и други езици, като гръцки, иврит или арабски. Три байта, започващи с 1110
, кодират повечето символи от азиатските езици (например китайски, японски, корейски). Четири байта, започващи с 11110
, кодират всичко останало – от рядко използвани исторически писмености до все по-разпространените символи за емоджита.Повечето модерни програмни езици имат вградена поддръжка за UTF-8, така че на повечето програмисти никога не им се налага да разберат как се превръщат символи в двоичен вид.
✏️ Опитай се във формата по-долу да кодираш символни низове в UTF-8, използвайки JavaScript. Изпробвай различни езици и символи.
В момента стандартът UTF-8 е най-разпространеното кодиране на HTML файлове в световната мрежа, като към декември 2019 г. е използван за 94,5% от уеб страниците.start superscript, 6, end superscript
🔎 Ако сега щракнеш с десния бутон на мишката и избереш "view page source (покажи изходния код на страницата)" на тази уеб страница, можеш да потърсиш за низа "utf-8" и да се увериш, че тя е кодирана с UTF-8.
Най-общо казано, добрата кодова таблица е тази, която може да представи максимално количество информация с най-малък брой битове. UTF-8 е прекрасен пример за това, тъй като може да кодира обикновените английски символи само с един байт, но е достатъчно гъвкава, за да кодира хиляди букви с допълнителни байтове.
Само че UTF-8 е само една възможна кодова таблица. UTF-16 и UTF-32 са други кодови таблици, които също са способни да представят всички Юникод символи. Съществуват и кодови таблици, специфични за конкретен език, като Shift-JIS за японски. Компютърните програми могат да използват кодовата таблица, която е най-подходяща за техните цели и ограничения.
🙋🏽🙋🏻♀️🙋🏿♂️Имаш ли въпроси по темата? Ще се радваме да ти отговорим, просто задай въпросите си по-долу!
Искаш ли да се присъединиш към разговора?
Все още няма публикации.