Como o texto do Zalgo funciona?

694

Eu vi textos estranhamente formatados chamados Zalgo, como abaixo, escritos em vários fóruns. É meio chato de se olhar, mas realmente me incomoda porque prejudica minha noção do que um personagem deveria ser. Meu entendimento é que um personagem deve se mover horizontalmente através de uma linha e permanecer dentro de um determinado "container". Obviamente, o texto do Zalgo está se movendo verticalmente e não parece estar restrito a nenhum espaço.

Isso é um bug / falha / exploit / hack no Unicode? Esses caracteres individuais têm propriedades estranhas? "O que esta acontecendo aqui?


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


Mike
fonte
31
en.wikipedia.org/wiki/Combining_character pode oferecer algumas dicas.
Lucas Jones
2
Isso também pode impressioná-lo
Burhan Ali
3
Como referência obrigatória, xkcd.com/1857
mackycheese21 /

Respostas:

431

O texto usa caracteres combinados, também conhecidos como marcas combinadas. Consulte a seção 2.11 de Combinar caracteres no padrão Unicode (PDF).

No Unicode, a renderização de caracteres não usa um modelo simples de célula de caracteres em que cada glifo se encaixa em uma caixa com determinada altura. Marcas combinadas podem ser renderizadas acima, abaixo ou dentro de um caractere base

Assim, você pode construir facilmente uma sequência de caracteres, consistindo em um caractere base e marcas "combinadas acima", de qualquer comprimento, para atingir qualquer altura visual desejada, assumindo que o software de renderização esteja em conformidade com o modelo de renderização Unicode. Essa sequência não tem significado, é claro, e até um macaco poderia produzi-la (por exemplo, dado um teclado com o driver adequado).

E você pode misturar as marcas "combinando acima" e "combinando abaixo".

O texto de exemplo na pergunta começa com:

Jukka K. Korpela
fonte
36
O Unicode pode fazer isso porque, deliberadamente, não está em conformidade com o "uso do mundo real de caracteres" - espera-se que o software esteja em conformidade com o Unicode. E é por isso que temos, por exemplo U+1F4A9.
Camilo Martin
2
Apenas para adicionar isso, aqui está uma lista dos caracteres combinados usados ​​acima, ou através do texto para gerar o "texto Zalgo": zalgotextgenerator.com/unicode
VKK
270

O texto do Zalgo funciona devido à combinação de caracteres. Esses são caracteres especiais que permitem modificar os caracteres anteriores.

insira a descrição da imagem aqui

OU

y + ̆ = y̆ que na verdade é

y + ̆ = y̆

Como você pode empilhá-los um sobre o outro, você pode produzir o seguinte:


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

que na verdade é:

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

O mesmo vale para colocar coisas por baixo:


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



que de fato é:

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

Em Unicode, o principal bloco de combinação de diacríticos para idiomas europeus e o Alfabeto fonético internacional é U + 0300 – U + 036F.

Mais sobre isso aqui

Para produzir uma lista de combinação de marcas diacríticas, você pode usar o seguinte script (como os links continuam morrendo)

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

Também confira



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

Matas Vaitkevicius
fonte
2
como você digitaria isso?
Aequitas
6
@Aequitas Se você está perguntando sobre ALTcódigos, então você não pode fazer isso, você poderia simplesmente colar y&#x0306;&#x0306;onde fica em 'puro' html e navegador faria isso de magia ...
Matas Vaitkevicius
2
@barbsan Oi, obrigado por me informar, substituí-o por um script que os gera.
Matas Vaitkevicius 16/11
Eu me pergunto por que você escolheu esse exemplo específico de Y com uma tildae. Na verdade, tem algum significado em russo, não tenho certeza se você está familiarizado com isso.
Sergeya
@SergeyA Acho que ele usa esse exemplo porque é o mesmo exemplo que a página da wikipedia vinculada ( en.wikipedia.org/wiki/Combining_character ) está usando.
Mischa