Машини та люди говорять «різними мовами», однак користувачі бачать на екрані комп'ютера зрозумілий їм текст, навіть якщо в пам'яті пристрою він зберігається у вигляді чисел. При створенні веб-сайту розробнику необхідно пам'ятати, що можливість використовувати його повинна бути не тільки у сервера, а й у кінцевого користувача. Для перетворення числового представлення інформації на її символьний вид використовують кодування. Довгий час розробники використовували різні схеми для трансформації тексту, і якщо на іншому пристрої працювало інше кодування, частина інформації не могла бути розпізнана та губилася. Ситуація виправилася з появою Юнікод. У нашому матеріалі відповідаємо на запитання: 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. Недоліки Юнікоду для різних ЯП та програм: За допомогою UTF-8 можна записати код будь-якої довжини.Однак, щоб робота алгоритму була ефективною і надійною, краще обмежити розмір коду. Unicode 6.х є чинним стандартом і передбачає використання коду до чотирьох байт UTF-8. UTF-8 і UTF-16 — два найширше використовувані кодування в стандарті Unicode. Вони обидві мають змінну довгу кодування. Один символ у них може бути представлений різною кількістю байт. У Юнікод всі дані зберігаються в таблиці і відсортовані за кількістю байт, яке вони мають в двійковій системі. На початку стандарту символи можуть займати всього 1 байт, тому UTF-8 зашифрує їх за допомогою 1 байта. Якщо дані вимагають двох байтів, то і в UTF-8 вони важитимуть два байти. UTF-8 кодує символ у двійковий рядок від одного до чотирьох байтів. Так, для шифрування латинських символів достатньо одного байта, а для кирилиць — двох. Для цих мов максимального потенціалу UTF-8 достатньо. UTF-16 оперує даними з двох та чотирьох байт. Кодування підходить для східних мов. UTF-8 є найпоширенішим методом кодування в Мережі, оскільки дозволяє зберігати текст, який містить будь-який символ. Він здатний перевести символи, що містяться в бібліотеці Юнікоду, в байти, а потім виконати зворотний процес. Комп'ютери постійно працюють з текстами: це стрічки сайтів новин, фондові біржі, повідомлення в соціальних мережах і месенджерах, банківські програми та багато іншого. Сьогодні ми не можемо уявити життя без передачі інформації. Але так не завжди. Комп'ютери навчилися працювати з текстом завдяки появі кодувань. Кодування пройшли великий шлях від таблиць символів, створених окремо для кожного комп'ютера, до єдиного кодування, прийнятого в усьому світі. Зараз Unicode - це основний стандарт кодування символів, що включає знаки майже всіх письмових мов світу. Unicode застосовується скрізь, де є текст. Інформація на сторінках у соціальних мережах, записи в базах даних, комп'ютерні програми та мобільні програми – все це працює з використанням Unicode. У цьому гайді ми розглянемо, як виник Unicode і які проблеми він вирішує. Дізнаємось, як зберігалася та передавалася інформація до введення єдиного стандарту кодування символів, а також розглянемо приклади кодувань, заснованих на Unicode. Історично комп'ютер створювався як машина для прискорення та автоматизації обчислень. Саме слово computer з англійської можна перекласти як обчислювач, а в 20 столітті в СРСР, до поширення терміну комп'ютер, використовувалася абревіатура ЕОМ - електронно-обчислювальна машина. Все, чим комп'ютери оперували – числа. Основним замовником та драйвером появи перших моделей були оборонні підприємства. На комп'ютерах проводили розрахунки параметрів польоту балістичних ракет, літаків, супутників. У 1950-ті роки обчислювальні потужності комп'ютерів стали використовувати для: Цілі, для яких розроблялися комп'ютери, призвели до появи архітектури, призначеної для роботи з числами. Вони зберігаються в комп'ютері таким чином: Наприкінці 1950-х років відбувається заміна ламп розжарювання на напівпровідникові елементи (транзистори та діоди). Використання нової технології дозволило зменшити розміри комп'ютерів, збільшити швидкість роботи та надійність обчислень, а також вплинуло на кінцеву вартість. Якщо перші комп'ютери були дорогими штучними проектами, які могли собі дозволити лише держави чи великі компанії, то із застосуванням напівпровідників почали з'являтися серійні комп'ютери, навіть не персональні. Поступово комп'ютери починають застосовуватися на вирішення як обчислювальних чи математичних завдань. Виникає необхідність обробки текстової інформації, але з літерами та іншими символами ситуація складніша, ніж з числами. Символи – це візуальний об'єкт. Навіть та сама буква «а» може бути представлена двома різними символами «а» і «А» залежно від регістру. Також число один можна представити у вигляді різних символів. Це може бути арабська цифра 1 чи римська цифра I. Значення числа не змінюється, але символи використовуються різні. Комп'ютери створювалися до роботи з числами, вони можуть зберігати символи. При введенні інформації в комп'ютер символи перетворюються на числа і зберігаються в пам'яті комп'ютера як звичайні числа, а при виведенні інформації відбувається зворотне перетворення з чисел символи. Правила перетворення символів і чисел зберігалися як таблиці символів (charset). Відповідно до такої таблиці для кожного комп'ютера конструювали свій унікальний пристрій введення/виведення інформації (наприклад, клавіатура і принтер). На початку 1960-х років комп'ютери були несумісні один з одним навіть у рамках однієї компанії-виробника. Наприклад, в IBM налічувалося близько 20 конструкторських бюро, і кожне розробляло свою власну модель. Такі комп'ютери були універсальними, вони створювалися на вирішення конкретних завдань. Для кожної розв'язуваної задачі формувалася необхідна таблиця символів і проектувалися пристрої введення/виведення інформації. У цей період починають формуватися мережі, які з'єднують у собі кілька комп'ютерів. Так, у 1958 році було створено систему SAGE (Semi-Automatic Ground Environment), що об'єднала радарні станції США та Канади в першу великомасштабну комп'ютерну мережу. При цьому, щоб результати обчислень одних комп'ютерів можна було використовувати на інших комп'ютерах мережі, вони повинні були мати однакові таблиці символів. У 1962 році компанія IBM формує два основні принципи для розвитку своєї лінійки комп'ютерів: Так було в 1965 року з'явилися комп'ютери IBM System/360. Це була лінійка із шести моделей, що складаються із сумісних модулів.Моделі відрізнялися за продуктивністю та вартістю, що дозволило замовникам гнучко підходити до вибору комп'ютера. Модульність систем призвела до появи нової галузі — виробництва сумісних із System/360 обчислювальних модулів. Компанії не потребували виробляти комп'ютер цілком, вони могли виходити ринку з окремими сумісними модулями. Все це призвело до ще більшого поширення комп'ютерів. Паралельно з цим розвивалися телетайпи. Телетайп це система передачі текстової інформації на відстані. Два принтери та дві клавіатури (насправді електромеханічні друкарські машинки) попарно з'єднувалися один з одним проводами. Текст, набраний на клавіатурі першого користувача, друкується на принтері другого користувача і навпаки. Таким чином, наприклад, було організовано «гарячу лінію» між президентом США та керівництвом СРСР аж до початку 1970-х років. Телетайпи також перетворять текстову інформацію на деякі сигнали, які передаються по проводах. При цьому не завжди використовується бінарний код, наприклад, в абетці Морзе використовуються 3 символи - точка, тире та пауза. Для телетайпів необхідні таблиці символів, відповідність яких будується між символами і сигналами у проводах. При цьому для кожного телетайпу (пари з'єднаних телетайпів) таблиці символів могли бути свої, виходячи із завдань, які вони вирішували. Відрізнятися, наприклад, могла мова, а отже, і сам набір символів, який відправлявся за допомогою пристрою.Для оптимізації роботи телетайпа найпопулярніші (часто зустрічаються) символи кодувалися найкоротшим набором сигналів, отже, і в рамках однієї мови, набір символів міг бути різним. На основі телетайп розробили термінали доступу до комп'ютерів. Такий телетайп відправляв повідомлення не другому користувачеві, а інформація вводилася на деякий віддалений комп'ютер, який після обробки зазначених команд, повертав результат у вигляді повідомлення у відповідь. Це нововведення дозволило використовувати тоді дуже дорогі обчислювальні потужності комп'ютерів, не маючи фізичного доступу до самого комп'ютера. Наприклад, комп'ютер міг розміщуватися в окремому обчислювальному центрі корпорації або інституту, а співробітники з інших філій або міст отримували доступ до обчислювальних потужностей комп'ютера за допомогою встановлених терміналів. Повсюдне поширення комп'ютерів та засобів обміну текстовою інформацією вимагало розробки єдиного стандарту кодування передачі та зберігання інформації. Такий стандарт розробили у США 1963 року. Таблицю зі 128 символів назвали ASCII - American standard code for information interchange (Американський стандарт кодів для обміну інформацією). Перші 32 символи в ASCII є керуючими. Вони використовувалися для того, щоб, наприклад, керувати принтером телетайпу і отримувати деякі складові символи. Наприклад: Введення символів, що управляють, дозволяло отримувати нові символи як комбінацію існуючих, не вводячи додаткові таблиці символів. Проте запровадження стандарту ASCII вирішило питання лише у англомовних країнах. У країнах з іншою писемністю, наприклад, з кирилицею в СРСР, проблема залишалася. Розвиток інтернету, збільшення кількості комп'ютерів та здешевлення пам'яті призвели до того, що проблеми, які спричиняла плутанина в кодуваннях, стали переважувати деяку економію пам'яті. Особливо яскраво це виявлялося в інтернеті, коли текст написаний на одному комп'ютері мав коректно відображатися на багатьох інших пристроях. Це доставляло величезні проблеми як програмістам, які повинні були вирішувати яке кодування використовувати, так і кінцевим користувачам, які не могли отримати доступ до текстів, що їх цікавлять. У результаті жовтні 1991 року з'явилася перша версія однієї загальної таблиці символів, названої Unicode. Вона включала на той час 7161 різний символ з 24 писемностей світу. У Unicode поступово додавалися нові мови та символи. Наприклад, у версію 1.0.1 у середині 1992 року додали понад 20 000 ідеограм китайської, японської та корейської мов. В актуальній на даний момент версії міститься вже понад 143 тисячі символів. Unicode можна уявити як величезну таблицю символів. У пам'яті комп'ютера записуються не самі символи, а номери таблиці. Записувати їх можна у різний спосіб. Саме для цього на основі Unicode розроблено кілька кодувань, що відрізняються способом запису номера символу Unicode у вигляді набору байт. Вони називаються UTF – Unicode Transformation Format.Є кодування постійної довжини, наприклад, UTF-32, де номер будь-якого символу з таблиці Unicode займає рівно 4 байти. Однак найбільшу популярність набула UTF-8 — кодування зі змінним числом байт. Вона дозволяє кодувати символи так, що найбільш поширені символи займають 1-2 байти, і тільки символи, що рідко зустрічаються, можуть використовувати по 4 байти. Наприклад, всі символи таблиці ASCII займають рівно по одному байти, тому текст, написаний англійською з використанням кодування UTF-8, займатиме стільки ж місця, як і текст, написаний з використанням таблиці символів ASCII. На сьогоднішній день Unicode є основним кодуванням, яке використовують у роботі всі, хто пов'язаний з комп'ютерами та текстами. Unicode дозволяє використовувати сотні тисяч різних символів та відображати їх однаково на всіх пристроях від мобільних телефонів до комп'ютерів на космічних станціях. При роботі з текстом на комп'ютерах та інших пристроях має бути справа з різноманітними кодуваннями. Без них обладнання не зможе працювати з літерами та символами. Існують різноманітні кодування. Сьогодні доведеться познайомитися з UTF-16 і порівняти цей стандарт з UTF-8. А ще - розібратися з тим, що являє собою кодування символом. Ця інформація буде корисна як IT-фахівцям, так і звичайним користувачам. Вона допоможе розібратися в ключових аспектах існуючих кодувань і пояснить, як працювати з UTF-16. Кодування символів – це процес присвоєння графічних символів різноманітних номерів. Особливо це стосується символів людської мови (алфавітів). За допомогою кодування можна буде зберігати, передавати та перетворювати текст за допомогою цифрових пристроїв, переважно комп'ютерів. Числові значення, які становлять кодування символів, – це кодові точки. Спільно вони формують кодовий простір. Він також називається картою символів або кодовими таблицями. Unicode – це стандарт шифрування (кодування) символів. Він використовується переважно для роботи з текстовими даними. Призначається для підтримки тексту у всіх світових системах писемності, доступних для оцифрування. За допомогою Юнікод можна зашифрувати всі алфавіти світу. Зараз цей стандарт є одним із найпоширеніших в Інтернеті.Він був запропонований 1991 року некомерційною організацією «Консорціум Юнікоду». Застосування відповідного стандарту дозволяє зашифрувати величезну кількість символів із різних систем писемності: Перемикати для реалізації поставленого завдання кодові сторінки не доведеться. Стандарт Unicode включає дві частини – універсальний набір символів (UCS) і сімейство кодувань (UTF). Перша використовується для перерахування допустимого за стандартом Юнікод символу. Кожному з них вона надає код у вигляді невід'ємного цілого числа, яке зазвичай записується у шістнадцятковій формі з префіксом U+. Друга частина (родина кодувань) визначає способи перетворення символів для їх подальшої передачі в потоці або документі. Unicode – стандарт, який передбачає кілька "версій". UTF-16 і UTF-8 саме до них відносяться. Далі потрібно дізнатися символи Unicode, записані відповідними методами. UTF-16 – це один із відомих способів кодування елементів Юнікоду. Вони представлені у вигляді послідовності 16-бітових слів. Відповідний спосіб шифрування дозволяє записувати компоненти Юнікоду в діапазонах: Загальна кількість доступних символьних елементів становить 1112064. Кожен компонент записується за допомогою сурогатних пар - одним або двома словами. UTF-16 описано у додатку Q до міжнародного стандарту ISO/IEC 10646. Перша версія Юнікоду була кодуванням в 16 біт. У неї було передбачено певну символьну ширину. Загальна кількість різних символів становила 216 - 65536.Друга версія Unicode вийшла в 1996. Разом з нею кодова область була значно розширена. У стандарті елементи кодуються 2 байтами з використанням різноманітних діапазонних значень: від 0 до FFFF16. Допустимо для шифрування використовувати діапазони 000016…D7FF16 та E00016…FFFF16. Виключений діапазон D80016…DFFF16 використовується для сурогатних пар. Так називаються символьні записи, які шифруються двома словами по 16 біт. Елементи Юнікоду до FFFF16 включно (без урахування "сурогатного" діапазону) записуються словом 16 біт як є. При використанні діапазону більше 16 біт (1000016…10FFFF16) необхідно для шифрування використовувати такий алгоритм: UTF-16 – стандарт, який використовується в Інтернеті дуже часто. У стандарті один символьний запис представлений послідовністю 2-х байтів або двох пар байтів Системи, які сумісні з процесорами x86, називають little endian. Щоб визначити порядок байтів, потрібно використовувати мітку порядків байтів.Якщо замість цього запису зчитується U+FFFE, порядок байтів буде зворотним. Розглянутий стандарт є найбільш поширеним у Windows-сімействі. Він найпопулярніший у API Win32. У другому випадку Windows не буде накладати на прикладне програмне забезпечення жодних обмежень у плані кодування текстових файлів. 16LE. Це необхідно врахувати, якщо потрібно працювати з документами, що виконуються, Використовують юнікодові версії функцій WinAPI. Рядки в них завжди кодуються через UTF-16LE. UTF-8 – це уявлення Юнікоду, яке забезпечує найкращу сумісність зі старими системами – такими, де використовувалися символьні записи 8 біт. послідовність довжиною від двох до 6 байт. Найчастіше – від 1 до 4 байт Це пов'язано з тим, що в Unicode немає символів з кодом більше 10FFFF.16. У найближчому майбутньому їх введення не планується. UTF-8 використовується як оптимізатор. Кодування відмінно підійде для поєднання з ASCII, які вимагають для кодування лише 1 байт.Цей стандарт добре працює з текстом англійською мовою, а також із веб-документами. Якщо говорити про раніше розглянутий стандарт (кодування UTF 16), він більше орієнтований працювати з великими символьними наборами. Більшість із них використовують для шифрування 2 байти, але деякі – 4 байти. Це оптимальне рішення для матеріалів, в яких зустрічаються переважно елементи, відмінні від ASCII. Як приклад можна навести азіатські алфавіти. UTF-8 – стандарт, який добре підходить для тексту, що базується на ASCII. До них відносять вихідні коди та HTML-документи. У веб-кодуванні цей варіант має попит за рахунок наступних моментів: Незважаючи на це, раніше згаданий та докладно розглянутий стандарт все одно має попит. UTF-16 стане в нагоді через: Працюючи з Java необхідно пам'ятати, що тип char і клас String в JVM використовує UTF-16. Він необхідний внутрішнього уявлення символів. Це означає таке: Взагалі, при виборі оптимального методу шифрування необхідно пам'ятати наступне: UTF-8 – лідер серед мережевих протоколів та текстових файлів. UTF-16 більше зустрічається у Windows. Бажаєте освоїти сучасну IT-спеціальність? Величезний вибір курсів по затребуваним IT-напрямкам є в Otus!
UTF-8 - що це і навіщо потрібне кодування символів
Що таке UTF-8
Для чого потрібне кодування символів
Переваги та недоліки
Максимальний потенціал
Порівняння UTF-8 та UTF-16
Висновок
Що таке кодування
Передумови появи кодувань
Комп'ютери та числа
Комп'ютери та символи
Розповсюдження комп'ютерів
ASCII як перший стандарт кодування інформації
Телетайп та термінал
ASCII
Перехід до Unicode
Кодування на основі Unicode
Резюме
UTF-16: що це таке і чим вона відрізняється від UTF-8
Про кодування символів
Юнікод
UTF-16 та його характеристика
Принцип кодування
Порядок байт
UTF-16 та Windows
UTF-8 та на відміну від UTF-16
Особливості стандартів