Скільки всього символів в UTF 8
Рядок у кодуванні UTF-8
Перетворює вхідний рядок на шістнадцятковий, двійковий або десятковий дамп у кодуванні UTF-8 і назад з дампа в рядок.
Нижче калькулятор можна використовувати для перетворення рядка в шістнадцятковий / двійковий або десятковий дамп в кодуванні utf-8. Калькулятор визначає кількість символів у рядку, число символів, що займають один, два, три або чотири байти у кодуванні utf8, а також загальна кількість байт у тексті, закодованому utf8.
Небагато інформації про подання рядків в Юнікоді та uft-8 можна знайти під калькуляторами.
Рядок у UTF-8
Наступний калькулятор виконує зворотне перетворення з рядкового дампа рядка кодування utf-8 в рядок. Основу подання закодованого рядка (16, 10 або 2) калькулятор може визначити автоматично. У десятковому дампі обов'язково розбиття рядка на байти. Як розділювач можна використовувати будь-який символ, наприклад пробіл.
UTF-8 у рядок
Передісторія кодування символів у рядку
У старі добрі часи, коли комп'ютери були ламповими смартфонами не було, а обсяг пам'яті персональних комп'ютерів часом не перевищував і одного мегабайта, для кодування одного символу в рядку вистачало лише одного байта. Першу "половину" байта займали цифри, символи латинського алфавіту, знаки пунктуації та інші корисні символи, всі разом відомі як таблиця ASCII. Другу половину розробники захопили кодування символів національних мов.Захоплення відбувалося відразу з різних кінців, незалежними фахівцями, що призвело до існування декількох різних кодувань навіть для однієї мови (наприклад для кирилиці існують такі одно-байтові кодування: КОІ-8, CP866, ISO 8859-5, Windows-1251) . Однобайтовий запис будь-якого символу був простим і дуже зручним для розробників програм. Однак наявність різних кодувань породжувало постійні проблеми у користувачів: для коректного відображення тексту потрібно було знати в якому кодуванні , для кожного кодування потрібно мати окремі шрифти. Крім того, з'ясувалося, що у світі існують мови, де число символів помітно більше, ніж 256, відповідно в один байт усі символи цих мов уже не могли поміститися.
Юнікод
Для вирішення вищеописаних проблем у 1991 році вигадали стандарт, що описує універсальний набір всіх символів - Юнікод. У першій версії Юнікоду налічувалося 7161 символів 1 . Для кодування цього числа символів достатньо 2-х байтів, що призвело до розквіту 2-х байт кодування UTF-16 в операційних системах і деяких мовах програмування. Оперувати двобайтовими символами в програмах виявилося нітрохи не складніше, ніж однобайтовими. Однак радість розробників тривала лише 10 років, версія 3.1 стандарту Unicode налічує у 13 разів більше символів, ніж перша. Загальна кількість символів досягла 94205 і для їх кодування вже мало двох байтів. На момент написання цієї статті останній стандарт Юнікоду 13.0 містить 143 859 символів, і роботи з додавання нових символів не припиняються. Найпростіше вирішення проблеми – знову подвоїти число байт для представлення символів. Для цього є кодування UTF-32, що дозволяє закодувати 2147483648 позицій.
UTF-8
Однак усьому є межа. Витрачати 4 байти на один символ здалося надто марнотратним. Тому UTF-32 не стала настільки популярною як UTF-16. Натомість, зараз найбільш популярне кодування зі змінною довжиною символу UTF-8. UTF-8 з'явилася в 1992 році і раніше використовувалася переважно в unix-системах. Велика перевага її полягає в тому, що текст, набраний латиницею, повністю сумісний з 7-бітним кодуванням ASCII, що застосовується з 1963 року.
За допомогою кодування UTF-8 можна закодувати 2097152 символів, що майже в 15 разів більше поточного обсягу символів, описаних в Юнікод.
Для визначення кількості байт, необхідних для кодування символу, використовується від одного до 5-ти старших біт 2 першого байта:
- 0 - однобайтовий символ, який відповідає таблиці ASCII, наприклад Символ долара
- 110 - дво-байтовий символ, наприклад Символ фунта
- 1110 - три-байтовий символ, наприклад Символ євро
- 11110 – чотири-байтовий символ, наприклад Смайлик
Кожен наступний байт містить 2-бітовий маркер додаткового байта: 10. Для отримання позиції символу в Юнікоді допоміжні біти просто видаляються, бітова послідовність, що залишилася, буде відповідати номеру символу.
UTF-8
UTF-8 (Від Unicode Transformation Format, 8-bit) — поширене кодування символів Юнікоду, сумісне з 8-бітними форматами передачі тексту. Знайшла широке застосування в операційних системах та веб-просторі.
На відміну від UTF-16, UTF-8 є кодуванням, що самосинхронізується: при втраті одного байти наступні байти будуть розкодовані коректно.
Текст, що складається лише із символів Юнікоду з номерами менше 128, під час запису в UTF-8 перетворюється на звичайний текст ASCII.І навпаки, у тексті UTF-8 будь-який байт зі значенням менше 128 зображує символ ASCII з тим самим кодом. Інші символи Юнікоду зображуються послідовностями довжиною від 2 до 6 байт (реально лише до 4 байт, оскільки використання кодів більше 2 21 не планується), в яких перший байт завжди має вигляд 11xxxxxx, а решта — 10xxxxxx.
Простіше кажучи, у форматі UTF-8 символи латинського алфавіту, розділові знаки та керуючі символи ASCII записуються кодами US-ASCII, a всі інші символи кодуються за допомогою декількох байтів зі старшим бітом 1. Це призводить до двох ефектів.
- Навіть якщо програма не розпізнає Юнікод, то латинські літери, арабські цифри та розділові знаки будуть відображатися правильно.
- У випадку, якщо латинські літери та найпростіші розділові знаки (включаючи пробіл) займають суттєвий обсяг тексту, UTF-8 дає виграш за обсягом порівняно з UTF-16.
На перший погляд може здатися, що UTF-16 зручніше, тому що в ній більшість символів кодується двома байтами.
Однак це зводиться нанівець необхідністю підтримки сурогатних пар, про які часто забувають при використанні UTF-16, реалізуючи лише підтримку символів UCS-2.
Формат UTF-8 був винайдений 2 вересня 1992 Кеном Томпсоном і Робом Пайком і реалізований в Plan 9. Зараз стандарт UTF-8 офіційно закріплений в документах RFC 3629 і ISO/IEC 10646 Annex D.
Примітка: Символи, закодовані в UTF-8, можуть бути довжиною до шести байт, однак стандарт Unicode не визначає символів вище 0x10ffff, тому символи Unicode можуть мати максимальний розмір 4 байти в UTF-8.
[ред.] Принцип кодування
[ред.] Текстовий опис
У UTF-8 можна кодувати значення кодів символів від 0 до 0x7FFFFFFF включно (всі комбінації 32-біт без встановленого старшого біта).
- Кожен символ кодується змінною кількістю послідовних 8-бітових байт (октетів). Кількість може варіюватися від 1 до 6 байт включно і визначається найпершим байтом.
- Всі ASCII-символи (0х00 - 0x7F включно) записуються таким самим байтом зі скинутим старшим бітом.
- Всі інші символи кодуються вже особливим чином і далі текст цього розділу стосується лише їх. Щоб краще зрозуміти принцип, краще уявляйте блоки біт з їх позицією.
- У байт ASCII-символів старший біт завжди встановлений в 1. При цьому другий біт завжди скинутий у не перших байт (у перших, відповідно, встановлений). Тому якщо читання виробляється з довільного байта, то по другому біту можна визначати проміжні байти.
- І в перших байт інші 6 молодших біт містять фрагмент коду символу (про це нижче).
Кількість байт, яке відводиться під символ, завжди дорівнює кількості старших біт, що йдуть поспіль, зі значенням 1 у першому байті. Ці біти завжди завершуються бітом зі значенням 0. Молодші біти першого байта, що залишилися, складають код символу. Звідси обумовлюється обмеження в 6 байт на символ - якщо вище, то в першому байті вже не вистачить під біти даних. Тому послідовності біт 11111110 (0xFE) і 11111111 (0xFF) загальноприйнято вважаються такими, що не використовуються в UTF-8.
До цього описувалася структура, а тепер про розташування даних.
Як видно з опису вище, кожен байт має певну кількість молодших біт під дані - змінне у першого і по 6 наступних. 32-бітовий код символу послідовно розміщується у цих контейнерах.Старші біти опиняються у перших байтах, а молодші – у останніх. Тому молодші 6 біт останнього байта завжди містять біти 0..5 код символу. Аналогічно передостанній байт містять біти 6..11, третій з кінця - 12..17, четвертий - 18..23, п'ятий - 24..29. Перший байт ж містить старші біти значення, що залишилися.
Знаючи структуру та розташування даних усередині байт, тепер розглянемо взаємозв'язок коду символу та кількості байт.
Кожна кількість байт здатна зберігати конкретний діапазон значень коду символу. При цьому самі діапазони значень розташовані щільно по порядку без будь-яких просвітів.
| Коди символів Unicode (HEX) | Розмір у UTF-8 | Представлені класи символів |
|---|---|---|
| 00000000 - 0000007F | 1 байт | ASCII, у тому числі латинський алфавіт, найпростіші розділові знаки та арабські цифри |
| 00000080 - 000007FF | 2 байти | кирилиця, розширена латиниця, арабська, вірменська, грецька, єврейська та коптська абетка; сирійський лист, тана, нко; МФА; деякі розділові знаки |
| 00000800 - 0000FFFF | 3 байти | всі інші сучасні форми писемності, у тому числі грузинський алфавіт, індійський, китайський, корейський та японський лист; складні розділові знаки; математичні та інші спеціальні символи |
| 00010000 - 001FFFFF | 4 байти | музичні символи, рідкісні китайські ієрогліфи, вимерлі форми писемності |
| 00200000 - 03FFFFFF | 5 байт | не використовується в Unicode |
| 04000000 - 7FFFFFFF | 6 байт | не використовується в Unicode |
Слід зазначити, що дана таблиця має на увазі щільне кодування, і тому вона представляє лише ідеальні комбінації.
Кодування UTF-8 не є однозначним, тому що в ньому враховується розмір біт значення без урахування позиції останнього встановленого біта.Тому можливе написання «грубого» кодувальника, який не відкидає лідируючі нулі. Наприклад, ASCII-символ «1» (0x31), може бути представлений наступними двобайтовими та трибайтовими послідовностями: 11000000 10110001 (0xC0 0xB1) та 11100000 10000000 10110001 (0xE0 0x80). Звідси виходять такі беззмилені бітові комбінації перших байт: 11000000 (0xC0), 11100000 (0xE0), 11110000 (0xF0), 11111000 (0xF8), 11111100 (0xFC), а також наступні за ними комбінації проміжних байт 10000000 (0x80).
[ред.] Максимальний потенціал
До цього розглядалося кодування UTF-8 лише 32-бітних цілих без негативних значень. Слід зазначити, що у стандарті Unicode використовуються символи лише до коду 0x001FFFFF включно. Тому навіть 32-бітових значень може вистачити, але цей розділ був включений для повноти викладу у разі використання UTF-8 для кодування несимвольних даних.
У першому байті кількість встановлених старших біт визначає кількість байт на символ. Молодші біти, що залишилися, зберігають старші біти значення коду символу. Ми можемо зробити припущення у тому, перший байт ні містити дані. При цьому припускаємо, що всі біти за межами байта дорівнюють нулю. Тоді дані будуть містити лише 6 біт у наступних байтах. Виходить 36 біт для семибайтового символу та 42 біта - для восьмибайтового.
[ред.] Невикористовувані значення байтів
У тексті UTF-8 принципово може бути байтів зі значеннями 254 (0xFE) і 255 (0xFF). Оскільки в Юнікоді не визначені символи з кодами вище 221, то в UTF-8 виявляються також значення байтів від 248 до 253 (0xF8 - 0xFD).Якщо заборонені штучно подовжені (за рахунок додавання провідних нулів) послідовності UTF-8, то не використовуються також байтові значення 192 та 193 (0xC0 та 0xC1).
[ред.] BOM (сигнатура)
Багато програм Windows (включаючи Блокнот) додають байти 0xEF, 0xBB, 0xBF на початку будь-якого документа, що зберігається як UTF-8.
Це мітка порядку байтів (англ. Byte Order Mark, BOM), також її часто називають сигнатурою (відповідно, UTF-8 та UTF-8 with Signature). За наявності сигнатури програми можуть автоматично визначити, чи файл закодований в UTF-8, проте файли з такою сигнатурою можуть некоректно оброблятися старими програмами, зокрема xml-аналізаторами. Такі редактори, як Notepad++, Notepad2 і Kate дозволяють явно вказувати, чи слід додавати сигнатуру при збереженні UTF-файлів.
Наприклад: У файлі записано одну латинську літеру «a».
- Якщо кодування цього файлу UTF-8 with Signature, то він міститиме: 0xEF 0xBB 0xBF 0x61
- Якщо кодування цього файлу UTF-8 (без сигнатури), він міститиме: 0x61
Якщо програма, що зчитує, не підтримує BOM, то ці три байти успішно розкодуються в один Unicode-символ 0xFEFF. Це не прориває слова пропуск нульової ширини і тому він може не відобразитися. Цей же символ використовується в BOM для кодування UTF-16 і UTF-32.
[ред.] Посилання
UTF-8 - що це і навіщо потрібне кодування символів
Машини та люди говорять «різними мовами», однак користувачі бачать на екрані комп'ютера зрозумілий їм текст, навіть якщо в пам'яті пристрою він зберігається у вигляді чисел. При створенні веб-сайту розробнику необхідно пам'ятати, що можливість використовувати його повинна бути не тільки у сервера, а й у кінцевого користувача.Для перетворення числового представлення інформації на її символьний вид використовують кодування. Довгий час розробники використовували різні схеми для трансформації тексту, і якщо на іншому пристрої працювало інше кодування, частина інформації не могла бути розпізнана та губилася. Ситуація виправилася з появою Юнікод. У нашому матеріалі відповідаємо на запитання: UTF-8 – що це? Навіщо служить? Які переваги та недоліки має стандарт?
Що таке UTF-8
UTF-8 (Unicode Transformation Format, 8-bit) - це система кодування, що працює за стандартом Unicode. У бібліотеці Юнікоду зберігається понад мільйон символів. Кожному з них надається унікальний код — кодова точка. Наприклад, для "!" кодовою точкою буде U+0021. UTF-8 перетворює символи Unicode на комп'ютерний текст — двійкові рядки. Крім того, кодування працює і у зворотний бік: від двійкових рядків до символів.
Зображення з starline на Freepik.
UTF-8 входить до сімейства кодувань Unicode, кожне з яких унікальне. Особливість UTF-8 у тому, що вона представляє символи в однобайтових одиницях. Один байт містить у найпростішому вигляді вісім біт інформації, що відбилося у назві кодування.
Для чого потрібне кодування символів
Комп'ютери обробляють інформацію у двійковій системі. Щоб розібратися в текстовому повідомленні, необхідно обробити послідовність нулів і одиниць. Наприклад, англійська літера А - це 01000001. Людині для розуміння тексту цього недостатньо, вона сприймає дані, записані за допомогою літер, цифр та інших символів, крім того йому знадобиться знання мови, на якій написано повідомлення.Щоб текст, переданий комп'ютером, став доступним для користувача, необхідно перетворити його числове подання на символьне. Інструментом для трансформації є кодування, які містять набір правил перетворення одного способу подання інформації в інший.
Комп'ютер говорить мовою бітів та байтів. Інформація у двійковій системі вимірюється за допомогою бітів. Якщо обсяг даних сягає 8 бітів, то зручності підрахунків використовують велику одиницю виміру — байт, далі йдуть кілобайти, мега- і гігабайти. Кожен текстовий символ записується в комп'ютерній системі у вигляді рядка бітів.
Людина говорить мовою символів. Одним із перших найбільш універсальних стандартів кодування є ASCII. Він має бібліотеки, в яких систематизовано елементи двох мов — байтової та символьної. Літерам, знакам пунктуації, цифрам надаються індивідуальні числові коди. Наприклад, літері «B» у верхньому регістрі за стандартом кодування ASCII надається код «066». Потім це позначення співвідноситься з двійковою системою: "066" - це 01000010 при записі в нулях і одиницях. У результаті кожному ідентифікатору належить свій символ та його байтовий аналог.
Стандарт ASCII містить дані про найпопулярніші символи і працює для передачі тексту, написаного латинськими літерами. Однак, користувачі веб-ресурсів, програм, програмного забезпечення та інших ІТ-продуктів розосереджені по всьому світу. Тому для кодування всіх мов людства і взагалі будь-якого символу, який будь-коли використовувався, включаючи емотикони, з'явився стандарт із ширшими можливостями для зберігання символів та відповідних кодів — Unicode. Його розуміють більшість комп'ютерів на планеті та носії основних світових мов. Юнікод зберігає результати перетворення інформації, виконаного через систему кодування UTF-8, UTF-16 або UTF-32.
Переваги та недоліки
Юнікод - це набір символів, взятих зі всіх мов світу, гліфів та емодзі. Сімейство кодувань UTF визначає, як символ буде представлений у двійковій системі. UTF-8 дозволяє користувачам працювати у сумісному із загальними стандартами та прийнятому у всьому світі багатомовному середовищі.
Мови програмування (ЯП) по-різному підтримують та використовують кодування. Іноді можуть спотворювати Unicode. Недоліки Юнікоду для різних ЯП та програм:
- PHP. Ця мова програмування підтримує 256 символів, тобто сприймає 1 символ у рядку за 1 байт інформації. Так відбувається, навіть якщо символ у рядку важить більше одного байта. Наприклад, смайл може важити чотири байти, а для PHP однаково один. Однак це можна виправити, налаштувавши багатобайтові функції. Тоді при підрахунку довжини рядка PHP звертатиметься до пам'яті, а не рахувати символ за байт.
- JavaScript. Працює з кодуванням UTF-16. Складні символи вимагають дві кодові точки для посилання.
- MySQL. Система управління базами даних не підтримує UTF-8 у його стандартному вигляді. MySQL недостатньо 24 бітів, щоб уявити один символ. СУБД підтримує розширену версію кодування UTF-8mb4.
Максимальний потенціал
За допомогою UTF-8 можна записати код будь-якої довжини. Однак, щоб робота алгоритму була ефективною і надійною, краще обмежити розмір коду. Unicode 6.х є чинним стандартом і передбачає використання коду до чотирьох байт UTF-8.
Порівняння UTF-8 та UTF-16
UTF-8 і UTF-16 — два найширше використовувані кодування в стандарті Unicode. Вони обидві мають змінну довгу кодування.Один символ у них може бути представлений різною кількістю байт. У Юнікоді всі дані зберігаються у таблиці та відсортовані за кількістю байт, яку вони мають у двійковій системі. На початку стандарту символи можуть займати всього 1 байт, тому UTF-8 зашифрує їх за допомогою 1 байта. Якщо дані вимагають двох байтів, то і в UTF-8 вони важитимуть два байти. UTF-8 кодує символ у двійковий рядок від одного до чотирьох байтів. Так, для шифрування латинських символів достатньо одного байта, а для кирилиць — двох. Для цих мов максимального потенціалу UTF-8 достатньо.
UTF-16 оперує даними з двох та чотирьох байт. Кодування підходить для східних мов.
Висновок
UTF-8 є найпоширенішим методом кодування в Мережі, оскільки дозволяє зберігати текст, який містить будь-який символ. Він здатний перевести символи, що містяться в бібліотеці Юнікоду, в байти, а потім виконати зворотний процес.
Подібні статті
- Скільки всього існує ангелів
- Скільки всього пружин у ПМ
- Скільки всього розрядів у тесляра
- Скільки всього китів
- Скільки всього частин Джека Горобця
- Скільки всього серій в анімі Відлуння терору
- Скільки всього Флешів
- Скільки всього відділів рослин