Що таке кодування символів
Кодування — це домовленість: «число 65 означає літеру A». Коли ви пишете текст, програма зберігає ці числа; коли інша людина його відкриває, її програма перетворює їх назад на літери за тією самою домовленістю. Якщо обидві не користуються однією таблицею, текст виходить неправильним.
Слід розрізняти дві ідеї. Перша — набір символів, тобто перелік того, яким числам які символи відповідають. Друга — те, як ці числа зберігаються в байтах. В ASCII вони збігаються тривіально; в Unicode — ні, і тут з'являється UTF-8.
ASCII: 128 символів по 7 бітів
ASCII (абревіатура від American Standard Code for Information Interchange) стандартизували в 1960-х роках. Вона використовує 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 (там, наприклад, є євро). Для кирилиці були свої сторінки, як-от Windows-1251 і KOI8-U.
Проблема в тому, що код 233 означає «é» в одній таблиці й щось інше в іншій. Текст, написаний за однією таблицею й прочитаний за іншою, показував нісенітницю. Unicode з'явився, щоб покласти край цьому безладу.
Unicode та UTF-8
Unicode присвоює унікальне число, яке називають кодовою точкою, кожному символу майже всіх систем письма світу, а також символам і емодзі. Сьогодні в ньому понад 150 000 символів. Кодову точку записують із префіксом 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 має понад 150 000, майже всіх мов і емодзі, а його перші 128 збігаються з ASCII.
Що таке UTF-8?
Це найпоширеніший спосіб зберігати текст Unicode в байтах. Він використовує від 1 до 4 байтів на символ: символи ASCII займають один, літера ñ — два, а емодзі — чотири.
Чому мій текст показує «Ã±» або «Ã©»?
Тому що текст, збережений в UTF-8, читають як Latin-1. Відкрийте файл із вказівкою кодування UTF-8, і це виправиться.