Как работает текст Zalgo? - PullRequest
658 голосов
/ 05 июля 2011

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

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


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


Ответы [ 2 ]

413 голосов
/ 01 декабря 2013

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

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

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

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

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

255 голосов
/ 29 апреля 2015

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

enter image description here

ИЛИ

y + & # x0306; = y & # x0306; что на самом деле

y + ̆ = y̆

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


у & # x0306; & # x0306; & # x0306; & # x0306; & # x0306; & # x0306; & # x0306; & # x0306; & # x0306; & # x0306; & # x0306; & # x0306 ; & # x0306; & # x0306; & # x0306; & # x0306; & # x0306; & # x0306;

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

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

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


у & # x0306; & # x0306; & # x0306; & # x0306; & # x0306; & # x0306; & # x0306; & # x0306; & # x0306; & # x0306; & # x0306; & # x0306 ; & # x0306; & # x0306; & # x0306; & # x0306; & # x0306; & # x0306; & # x0330; & # x0330; & # x0330; & # x0330; & # x0330; & # x0330; & # x0330; & # x0330; & # x0330; & # x0330; & # x0330; & # x0330; & # x0330; & # x0330; & # x0330;



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

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

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

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

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

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

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



* +1039 * M & # x363; & # x36d; & # x363; & # x33e; x36d & #;; V & # x363; & # x365 & # x35b; & # x364; & # x36e; & # x365; & # x368; & # x365; & # x367; & # x33e;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...