utf8 таблиця

Колись я був згенерував таблицю Юнікоду, я тоді думав що згенерував UTF8 таблицю (бо ж там усі символи, так?), так то воно так, але трохи не так — це різні штуки. Посидівши останніми днями я трохи розібрався у цьому питанні, покращив стару таблицю та створив таблицю UTF-8 символів, з окремими сторінками по байтах.

То ж яка різниця між Юнікодом та UTF-8? Виявляється що Юнікод — це просто перелічення всіх відомих символів, де кожен символ має номер (code point), 1, 2, 3, ..., 1.114.111. Усіх символів є < 221 і їх можна було б усіх вмістити в 3 байти, але ніт — так історично склалось що юнікод не є кодуванням сам по собі, а використовує для цього інші кодування, як от UTF-8, який зараз є на 95% усіх сайтів.

UTF-8 таблиця містить такі ж символи як таблиця Unicode, але різниця у розміщенні — кожен символ передається одним, двома, трьома або 4-ма байтами:

1 байт — 0xxxxxxx
2 байти — 110xxxxx 10xxxxxx
3 байти — 1110xxxx 10xxxxxx 10xxxxxx
4 байти — 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

усе залежить від перших бітів кожного байту. Як можна замітити для 4-байтних символів корисними є лише 21 біт, чого якраз і достатньо для усіх символів. Але далеко не всі символи є допустимими. Щоб дізнатись які — я і згенерував таблицю, і загалом за довольнив свою першочергову цікавість.

Та насправді — я хотів зробити таблицю всіх символів — щоб переглянути усі можливі символи, але їх є БІЛЬШЕ! Є символи які дозволяють комбінувати інші символи. Одні з більш очевидних — діакритичні знаки, наголоси, дашки, ... — символи, які ставляться після іншого символу і змінюють його. Трохи побавившись з цією табличкою в мене вийшли такі комбінації:

ж͍ ж̿ ж͎ ж᷉ ж̫ ж̾ ж͓̽ ӂ̈ 👼̾ 👼᷉ 👼͠ o͟0 o͜0 ×͝× ж͙͙͙ а͢я ж̥͓̥͓

Якщо ви на windows то ці знаки виглядатимуть поламано, співчуваю 😕… Кумедно, що можна додавати знаки також до емоційок, наприклад чубчик чи блискавку аля гаррі-поттер для немовля. Або додавати декілька діакритиків одночасно, якщо багато накласти то може вийти матриця:

Також є модифікатори кольору шкіри, наприклад:

🎅 + 🏾 = 🎅🏾

Але найбільш вражаючим є З'єднувач нульової ширини — це невидимий символ який може з'єднувати інші символи, наприклад:

👩 + ❤ + 💋 + 👨 = 👩‍❤️‍💋‍👨

І є достобіса таких ланцюжків, наприклад тут чи тут — можливостей багато.

А ще є прапори — вони взагалі геніальні! Можна було б подумати що в таблиці є символ для кожного прапора, але ніт — в таблиці є лише 26 спеціальних символів, якими передаються усі без винятку прапори. Кожен символ відповідає латинській букві, а якщо поставити два таких символа поряд — відобразиться прапор коду цієї країни згідно стандарту ISO 3166-1, наприклад:

🇺 + 🇦 = 🇺🇦

Таким чином не потрібно випускати нову версію таблиці кожного разу коли зникає/появляється країна — дужже розумно, хоча з другого боку кожен прапор займає 8 байт замість 4, але то таке.

Тож відповідь на питання «скільки є знаків» — БАГАТО 😅.