Ми помітили прогалину на ринку соціальних мереж для дуже-дуже коротких дописів. Тепер, коли Twitter дозволяє дописи на 280 символів, ті, хто хоче швидко оновлювати свої соцмережі, не отримують належного сервісу. Ми вирішуємо створити власну соціальну мережу.
Щоб наш продукт був помітним, ми робимо його екстремальним і дозволяємо лише дописи з 5 символів або менше. Будь-які дописи, довші за 5 символів, потрібно обрізати до 5.
Щоб наші користувачі могли висловитися повністю, ми дозволяємо емодзі та інші символи Unicode.
Завдання - обрізати вхідні рядки тексту (англ. string) до 5 символів.
Текст, збережений у цифровому вигляді, потрібно перетворити на послідовність байтів. У поширеному вжитку є 3 способи зіставити символи з байтами.
І UTF-8, і UTF-16 є кодуваннями Unicode, а отже вони здатні представити величезний діапазон символів, зокрема:
І UTF-8, і UTF-16 є кодуваннями зі змінною довжиною, тобто різні символи займають різну кількість місця.
Погляньмо на літеру «a» та емодзі «😛». У UTF-16 літера займає 2 байти, а емодзі займає 4 байти.
Секрет цієї вправи - використовувати API, побудовані навколо символів Unicode (кодових точок), а не кодових одиниць Unicode.
«Звичайний» рядок тексту (англ. string) у кодуванні UTF-16 можна подати як послідовність символів, де кожен символ може займати до 16 бітів (звідси й назва UTF-16). Це означає, що 16 бітами, тобто 1 кодовою одиницею, можна подати щонайбільше 2¹⁶ (два в шістнадцятому степені), або 65536 можливих символів. Ці 65536 символів утворюють так звану базову багатомовну площину, якої достатньо для найпоширеніших символів більшості мов.
Однак деякі символи не вміщуються в одну кодову одиницю. Розвʼязок - подавати їх двома кодовими одиницями. Ці дві кодові одиниці UTF-16, які часто називають сурогатною парою, утворюють кодову точку.
Отже, підсумуймо: коли йдеться про кодування UTF-16:
code unit - це 16 (або менше) бітів, що представляють один символ.code point - це одна або дві кодові одиниці, що представляють один символ.Щоб заплутати ще більше, існують також графемні кластери, тобто, по суті, послідовності символів Unicode (кодових точок), які потрібно сприймати як одне візуальне ціле. Наприклад, деякі емодзі, як ось це 👨👦.
Більшість вбудованих методів JavaScript працюють із рядками тексту в кодуванні UTF-16, проте працюють вони на основі кодових одиниць UTF-16.
Наприклад, метод String.prototype.split("") розділяє рядок тексту на кодові одиниці.
З іншого боку, String iterators перебирають елементи за кодовими точками.
Значно більше про рядки тексту Unicode і приклади до них можна прочитати на MDN.
Зареєструйтеся на Exercism, щоб вивчати й опановувати JavaScript, а також 37 концепцій159 вправ та справжнє наставництво від людей, і все це безкоштовно.