Как работает текст Zalgo?

Я видел странно отформатированный текст под названием Zalgo, как показано ниже, на различных форумах. На это немного раздражает взгляд, но это действительно беспокоит меня, потому что это подрывает мое представление о том, каким должен быть персонаж. Насколько я понимаю, персонаж должен перемещаться горизонтально через линию и оставаться в определенном "контейнере". Очевидно, что текст Zalgo движется вертикально и, кажется, не ограничен каким-либо пространством.

Это ошибка / ошибка / эксплойт / хак в Юникоде? Являются ли эти отдельные персонажи странными свойствами? "Что здесь происходит?


H̡̫̤̤̣͉̤ͭ̓̓̇͗̎̀ơ̯̗̱̘̮͒̄̀̈ͤ̀͡w͓̲͙͖̥͉̹͋ͬ̊ͦ̂̀̚ ͎͉͖̌ͯͅͅd̳̘̿̃̔̏ͣ͂̉̕ŏ̖̙͋ͤ̊͗̓͟͜e͈͕̯̮̙̣͓͌ͭ̍̐̃͒s͙͔̺͇̗̱̿̊̇͞ ̸̤͓̞̱̫ͩͩ͑̋̀ͮͥͦ̊Z̆̊͊҉҉̠̱̦̩͕ą̟̹͈̺̹̋̅ͯĺ̡̘̹̻̩̩͋͘g̪͚͗ͬ͒o̢̖͇̬͍͇͓̔͋͊̓ ̢͈͙͂ͣ̏̿͐͂ͯ͠t̛͓̖̻̲ͤ̈ͣ͝e͋̄ͬ̽͜҉͚̭͇ͅx͎̬̠͇̌ͤ̓̂̓͐͐́͋͡ț̗̹̝̄̌̀ͧͩ̕͢ ̮̗̩̳̱̾w͎̭̤͍͇̰̄͗ͭ̃͗ͮ̐o̢̯̻̰̼͕̾ͣͬ̽̔̍͟ͅr̢̪͙͍̠̀ͅǩ̵̶̗̮̮ͪ́? ̙͉̥̬͙̟̮͕ͤ̌͗ͩ̕͡


2 ответа

Решение

В тексте используются комбинирующие символы, также известные как комбинирующие знаки. См. Раздел 2.11 " Объединение символов в стандарте Unicode" (PDF).

В Юникоде при рендеринге символов не используется простая модель ячейки, в которой каждый глиф вписывается в поле с заданной высотой. Комбинированные метки могут быть выполнены выше, ниже или внутри базового символа

Таким образом, вы можете легко построить последовательность символов, состоящую из базового символа и меток "комбинирование выше" любой длины, чтобы достичь любой желаемой визуальной высоты, при условии, что программное обеспечение рендеринга соответствует модели рендеринга Unicode. Такая последовательность, конечно, не имеет смысла, и даже обезьяна могла бы ее создать (например, с помощью клавиатуры с подходящим драйвером).

И вы можете смешать отметки "объединение сверху" и "объединение снизу".

Пример текста в вопросе начинается с:

Текст Zalgo работает из-за сочетания символов. Это специальные символы, которые позволяют изменять предшествующий символ.

введите описание изображения здесь

ИЛИ ЖЕ

y + ̆ = y̆, который на самом деле

y + ̆ = y̆

Поскольку вы можете сложить их друг над другом, вы можете создать следующее:


Y

что на самом деле является:

y̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆

То же самое касается размещения вещей под:


Y



что на самом деле это:

y̰̰̰̰̰̰̰̰̰̰̰̰̰̰̰̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆

В Unicode основным блоком объединения диакритических знаков для европейских языков и международного фонетического алфавита является U+0300–U+036F.

Подробнее об этом здесь

Для составления списка сочетаний диакритических знаков вы можете использовать следующий скрипт (поскольку ссылки продолжают умирать)

for(var i=768; i<879; i++){console.log(new DOMParser().parseFromString("&#"+i+";", "text/html").documentElement.textContent +"  "+"&#"+i+";");}

Также проверьте их



Mͣͭͣ̾ Vͣͥͭ͛ͤͮͥͨͥͧ̾

Другие вопросы по тегам