Какво е кодиране на знаци
Кодирането е уговорка: «числото 65 означава буквата A». Когато пишете текст, програмата запазва тези числа; когато друг човек го отвори, неговата програма ги превежда обратно в букви по същата уговорка. Ако двамата не ползват една и съща таблица, текстът излиза грешен.
Трябва да разграничим две идеи. Едната е наборът от знаци, списъкът кои числа на кои символи съответстват. Другата е как тези числа се записват в байтове. В ASCII двете съвпадат по тривиален начин; в Unicode не, и тук влиза UTF-8.
ASCII: 128 знака от 7 бита
ASCII (съкращение от American Standard Code for Information Interchange) е стандартизиран през 60-те години на XX век. Ползва 7 бита, тоест 2 на степен 7 = 128 кода, от 0 до 127. От тях 33 са управляващи знаци (от 0 до 31 и 127), а 95 са печатни (от 32 до 126, включително интервала).
Не включва букви с диакритични знаци, нито кирилица, нито знака за евро: проектиран е за английския. Това обяснява защо по-късно са били нужни други таблици.
| Управляващ знак | Десетично | Шестнадесетично | Двоично (7 бита) | За какво служи |
|---|---|---|---|---|
| Нула (NUL) | 0 | 00 | 0000000 | Бележи края на низ в няколко езика |
| Хоризонтална табулация (TAB) | 9 | 09 | 0001001 | Прескача до следващата табулация |
| Нов ред (LF) | 10 | 0A | 0001010 | Слиза на следващия ред |
| Връщане на каретката (CR) | 13 | 0D | 0001101 | Връща се в началото на реда |
| Escape (ESC) | 27 | 1B | 0011011 | Започва управляващи последователности |
| Интервал | 32 | 20 | 0100000 | Първият печатен знак |
| Изтриване (DEL) | 127 | 7F | 1111111 | Изтрива знака |
Закономерности, които е добре да запомните
Таблицата не е подредена случайно. С няколко закономерности можете да четете кодове наизуст.
- Цифрите от «0» до «9» заемат от 48 до 57 (30 до 39 в шестнадесетична система). Стойността на цифрата е нейният код минус 48: «7» е 55 и 55 − 48 = 7.
- Главните букви са от 65 («A») до 90 («Z»), а малките от 97 («a») до 122 («z»).
- Разликата между главна буква и нейната малка е винаги 32: «A» = 65 и «a» = 97; «C» = 67 и «c» = 99. В двоична система се променя само един бит: 01000001 за «A» и 01100001 за «a».
- За да разберете кое място в азбуката заема главна буква, извадете 64: «C» е 67 и 67 − 64 = 3, третата буква.
- Тъй като всички главни букви (65 до 90) имат кодове по-малки от малките (97 до 122), азбучно подреждане «по код» поставя «Zebra» преди «apple». Много програми се нуждаят от отделна опция за сравнение, за да подреждат правилно.
Край на реда: LF, CR и CRLF
Преминаването на нов ред изглежда нещо просто, но се записва различно според системата. Unix, Linux и macOS ползват един знак, LF (10). Windows ползва два последователни, CR и LF (13 и 10), известни като CRLF. Старите телетайпи са имали нужда от две отделни команди: връщане на каретката в началото и придвижване на хартията с един ред.
Тази разлика е причина за файлове, които в обикновен редактор се виждат на един ред, или със странен символ в края на всеки ред. Ако търсите кой код има всеки от тях, напишете LF или CR в търсачката на ASCII таблица.
«Разширеният ASCII» не е стандарт
Тъй като един байт има 8 бита, а ASCII ползва само 7, оставали са 128 свободни кода (от 128 до 255) и всеки производител и регион ги е запълнил по свой начин. Това се нарича «разширен ASCII», но не съществува една-единствена таблица: има много, наречени кодови страници. Две от най-известните са Latin-1 (ISO-8859-1), където é е код 233, и Windows-1252, подобна, но с разлики в кодовете от 128 до 159 (там е например еврото).
Проблемът е, че код 233 означава «é» в една таблица и нещо друго в друга. Текст, написан с една таблица и прочетен с друга, показваше боклук. Unicode се ражда, за да сложи край на този безпорядък.
Unicode и UTF-8
Unicode присвоява уникално число, наречено кодова точка, на всеки знак от почти всички писмености в света, плюс символи и емоджита. Днес съдържа над 150000 знака. Записва се с префикса U+ и в шестнадесетична система: «A» е U+0041, «ñ» е U+00F1, еврото е U+20AC, а емоджито с усмихнато лице е U+1F600. Първите 128 кодови точки са точно тези на ASCII.
UTF-8 е най-разпространеният начин за запазване на тези числа в байтове и ползва от 1 до 4 според знака. 128-те знака на ASCII заемат един байт, идентичен с досегашния, така че един ASCII текст е същевременно валиден UTF-8 текст. Останалите заемат повече байтове.
| Знак | Кодова точка | Байтове в UTF-8 | Байтове (шестнадесетично) |
|---|---|---|---|
| A | U+0041 | 1 | 41 |
| é | U+00E9 | 2 | C3 A9 |
| ñ | U+00F1 | 2 | C3 B1 |
| € | U+20AC | 3 | E2 82 AC |
| 😀 | U+1F600 | 4 | F0 9F 98 80 |
Защо се появява «Ã±» вместо «ñ»
Това е най-честата грешка и има точно обяснение. Буквата ñ в UTF-8 са два байта: C3 и B1. Ако програмата реши, че текстът е в Latin-1, чете всеки байт като отделен знак: C3 е «Ã», а B1 е «±». Резултат: «Ã±». Същото се случва с «é», което се вижда като «Ã©», и с «canción», което се появява като «canción». При кирилица е същото, само че всяка буква са два байта и на екрана се сипят двойки странни знаци.
Решението почти винаги е да кажете на програмата да отвори файла като UTF-8 (в текстов редактор или в настройките за внос на електронна таблица). Когато стане обратното, текст в Latin-1, прочетен като UTF-8, обикновено се появяват ромбове с въпросителна, защото тези единични байтове не образуват валидни UTF-8 последователности.
Как да ползвате ASCII таблицата и конвертора
Инструментът «ASCII таблица» показва 128-те знака с техния код в десетична, шестнадесетична, осмична и двоична система и името на управляващите.
- Напишете в търсачката знак, код или името на управляващ знак (например A, 65, 41 или LF), за да намерите неговия ред.
- Ползвайте бутоните за филтриране (Управляващи, Цифри, Главни букви, Малки букви, Знаци), за да видите само една група.
- За преобразуване напишете текст в «Текст» и изберете формата (десетичен, шестнадесетичен, осмичен или двоичен): отдолу се появяват кодовете. «Hola» дава 72 111 108 97 в десетичен и 48 6F 6C 61 в шестнадесетичен вид.
- Можете и обратното: поставете кодове, разделени с интервали или запетаи, в «Кодове» и се съставя текстът. В шестнадесетичен вид се приемат префикси като 0x41.
Ако текстът съдържа знаци, които не са ASCII, като ñ, инструментът ви предупреждава и показва техния Unicode код. За да видите реалните байтове в UTF-8, ползвайте «Текст в двоичен код»: ñ дава 11000011 10110001, два байта по 8 бита. Ограниченията: таблицата показва само стандартния ASCII, не разширения, и всичко се изчислява във вашия браузър, без да се изпраща текстът към сървър.
Често задавани въпроси
Колко знака има ASCII?
128, с кодове от 0 до 127 и по 7 бита всеки. От тях 33 са управляващи и 95 са печатни, като се брои и интервалът.
Какъв е ASCII кодът на буквата A и на a?
«A» е 65 (41 в шестнадесетична, 01000001 в двоична система), а «a» е 97 (61 в шестнадесетична, 01100001 в двоична система). Винаги се различават с 32.
Каква е разликата между ASCII и Unicode?
ASCII има 128 знака, предвидени за английския. Unicode има над 150000, от почти всички езици и емоджита, а първите му 128 са същите като в ASCII.
Какво е UTF-8?
Това е най-разпространеният начин да се запазва Unicode текст в байтове. Ползва от 1 до 4 байта на знак: тези от ASCII заемат един, ñ заема два, а едно емоджи заема четири.
Защо текстът ми показва «Ã±» или «Ã©»?
Защото текст, запазен в UTF-8, се чете като Latin-1. Отворете файла, като укажете кодирането UTF-8, и проблемът се решава.