Как работает текст Zalgo?
Я видел странно отформатированный текст под названием Zalgo, как показано ниже, на различных форумах. На это немного раздражает взгляд, но это действительно беспокоит меня, потому что это подрывает мое представление о том, каким должен быть персонаж. Насколько я понимаю, персонаж должен перемещаться горизонтально через линию и оставаться в определенном "контейнере". Очевидно, что текст Zalgo движется вертикально и, кажется, не ограничен каким-либо пространством.
Это ошибка / ошибка / эксплойт / хак в Юникоде? Являются ли эти отдельные персонажи странными свойствами? "Что здесь происходит?
H̡̫̤̤̣͉̤ͭ̓̓̇͗̎̀ơ̯̗̱̘̮͒̄̀̈ͤ̀͡w͓̲͙͖̥͉̹͋ͬ̊ͦ̂̀̚ ͎͉͖̌ͯͅͅd̳̘̿̃̔̏ͣ͂̉̕ŏ̖̙͋ͤ̊͗̓͟͜e͈͕̯̮̙̣͓͌ͭ̍̐̃͒s͙͔̺͇̗̱̿̊̇͞ ̸̤͓̞̱̫ͩͩ͑̋̀ͮͥͦ̊Z̆̊͊҉҉̠̱̦̩͕ą̟̹͈̺̹̋̅ͯĺ̡̘̹̻̩̩͋͘g̪͚͗ͬ͒o̢̖͇̬͍͇͓̔͋͊̓ ̢͈͙͂ͣ̏̿͐͂ͯ͠t̛͓̖̻̲ͤ̈ͣ͝e͋̄ͬ̽͜҉͚̭͇ͅx͎̬̠͇̌ͤ̓̂̓͐͐́͋͡ț̗̹̝̄̌̀ͧͩ̕͢ ̮̗̩̳̱̾w͎̭̤͍͇̰̄͗ͭ̃͗ͮ̐o̢̯̻̰̼͕̾ͣͬ̽̔̍͟ͅr̢̪͙͍̠̀ͅǩ̵̶̗̮̮ͪ́? ̙͉̥̬͙̟̮͕ͤ̌͗ͩ̕͡
2 ответа
В тексте используются комбинирующие символы, также известные как комбинирующие знаки. См. Раздел 2.11 " Объединение символов в стандарте Unicode" (PDF).
В Юникоде при рендеринге символов не используется простая модель ячейки, в которой каждый глиф вписывается в поле с заданной высотой. Комбинированные метки могут быть выполнены выше, ниже или внутри базового символа
Таким образом, вы можете легко построить последовательность символов, состоящую из базового символа и меток "комбинирование выше" любой длины, чтобы достичь любой желаемой визуальной высоты, при условии, что программное обеспечение рендеринга соответствует модели рендеринга Unicode. Такая последовательность, конечно, не имеет смысла, и даже обезьяна могла бы ее создать (например, с помощью клавиатуры с подходящим драйвером).
И вы можете смешать отметки "объединение сверху" и "объединение снизу".
Пример текста в вопросе начинается с:
- LATIN CAPITAL LETTER H -
H
- КОМБИНИРОВАНИЕ ЛАТИНСКОГО МАЛЕНЬКОГО ПИСЬМА Т -
ͭ
- КОМБИНИРОВАНИЕ ГРЕЧЕСКОГО КОРОНИСА -
̓
- КОМБИНИРОВАНИЕ КОММА ВЫШЕ -
̓
- КОМБИНИРОВАННАЯ ТОЧКА ВЫШЕ -
̇
Текст 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ͣͥͭ͛ͤͮͥͨͥͧ̾