Змінити текст Unicode досить складно з багатьох причин.
По-перше, в залежності від мови програмування, рядки подаються по-різному, або як список байтів, або список кодових одиниць UTF-16 (ширина 16 біт, які часто називають "символами" в API), або як кодові точки ucs4 (Ширина 4 байти).
По-друге, різні API відображають це внутрішнє уявлення в різному ступені. Хтось працює над абстракцією байтів, хтось над символами UTF-16, хтось над кодовими точками. Коли в поданні використовуються байти або символи UTF-16, зазвичай є частини API, які надають вам доступ до елементів цього подання, а також частини, які виконують необхідну логіку для отримання з байтів (через UTF-8) або з UTF-16 символів до фактичних точок коду.
Часто частини API, що виконують цю логіку і, таким чином, надаючи вам доступ до точок коду, додають пізніше, оскільки спочатку був 7-бітний ascii, потім трохи пізніше всі вважали, що 8 бітів достатньо, використовуючи різні кодові сторінки, і навіть пізніше, що 16 біт було достатньо для Unicode. Поняття кодових точок як цілих чисел без фіксованої верхньої межі було історично додано як четверту загальну довжину символу для логічного кодування тексту.
Використання API, що дає вам доступ до фактичних точок коду, здається, це все. Але ...
По-третє, існує безліч кодових точок модифікаторів, що впливають на наступну кодову точку або наступні кодові точки. Наприклад, є діакритичний модифікатор, який перетворює наступне a на ä, e на ë тощо. Поверніть кодові точки навколо, і Aë стає eä, з різних букв. Існує пряме представлення, наприклад, ä як власної кодової точки, але використання модифікатора є настільки ж правильним.
По-четверте, все постійно змінюється. Також є багато модифікаторів серед смайликів, як це використано у прикладі, і щороку додаються нові. Отже, якщо API надає вам доступ до інформації, чи є кодова точка модифікатором, версія API визначатиме, чи знає він вже конкретний новий модифікатор.
Unicode, однак, дає хитрий трюк, коли мова йде лише про візуальний вигляд:
Є модифікатори напрямку написання. У випадку прикладу використовується напрямок письма зліва направо. Просто додайте модифікатор напрямку письма справа наліво на початку тексту, і залежно від версії API / браузера він буде виглядати правильно зворотно 😎
'\ u202e' називається заміною справа наліво, це найсильніша версія маркера справа наліво.
Див. Це пояснення w3.org
const text = 'Hello world👩🦰👩👩👦👦'
console.log('\u202e' + text)
const text = 'Hello world👩🦰👩👩👦👦'
let original = document.getElementById('original')
original.appendChild(document.createTextNode(text))
let result = document.getElementById('result')
result.appendChild(document.createTextNode('\u202e' + text))
body {
font-family: sans-serif
}
<p id="original"></p>
<p id="result"></p>