Jak działa tekst Zalgo?

694

Na różnych forach widziałem dziwnie sformatowany tekst o nazwie Zalgo, jak poniżej. To trochę denerwujące, ale naprawdę przeszkadza mi, ponieważ podważa moje wyobrażenie o tym, jaka postać powinna być. Rozumiem, że postać powinna poruszać się poziomo przez linię i pozostać w pewnym „pojemniku”. Oczywiście tekst Zalgo porusza się w pionie i nie wydaje się być ograniczony do żadnej przestrzeni.

Czy to jest błąd / błąd / exploit / hack w Unicode? Czy te pojedyncze postacie mają dziwne właściwości? "Co tu się dzieje?


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


Mikrofon
źródło
31
en.wikipedia.org/wiki/Combining_character może dostarczyć wskazówek.
Lucas Jones,
2
To może również zaskoczyć: en.wikipedia.org/wiki/…
Burhan Ali
3
Jako obowiązkowe odniesienie, xkcd.com/1857
mackycheese21

Odpowiedzi:

431

Tekst używa łączenia znaków, znanego również jako łączenie znaków. Zobacz rozdział 2.11 Łączenie znaków w standardzie Unicode (PDF).

W Unicode do renderowania znaków nie stosuje się prostego modelu komórek znakowych, w którym każdy glif pasuje do ramki o podanej wysokości. Łączące znaki mogą być renderowane powyżej, poniżej lub wewnątrz znaku podstawowego

W ten sposób można łatwo skonstruować sekwencję znaków składającą się ze znaku podstawowego i znaków „łączących się powyżej” o dowolnej długości, aby osiągnąć dowolną pożądaną wysokość wizualną, przy założeniu, że oprogramowanie do renderowania jest zgodne z modelem renderowania Unicode. Taka sekwencja nie ma oczywiście znaczenia, a nawet małpa mogłaby ją wyprodukować (np. Mając klawiaturę z odpowiednim sterownikiem).

I możesz łączyć znaki „łączenie powyżej” i „łączenie poniżej”.

Przykładowy tekst pytania zaczyna się od:

Jukka K. Korpela
źródło
36
Unicode może to zrobić, ponieważ celowo nie jest zgodny z niczym innym, jak „rzeczywistym wykorzystaniem znaków w świecie rzeczywistym” - oczekuje się, że oprogramowanie będzie zgodne z Unicode. I dlatego mamy np U+1F4A9.
Camilo Martin
2
Aby dodać do tego, oto lista łączących znaków użytych powyżej poniżej lub poprzez tekst w celu wygenerowania „tekstu Zalgo”: zalgotextgenerator.com/unicode
VKK
270

Tekst Zalgo działa z powodu łączenia znaków. Są to znaki specjalne, które pozwalają modyfikować znaki występujące wcześniej.

wprowadź opis zdjęcia tutaj

LUB

y + ̆ = y̆, które faktycznie jest

y + ̆ = y̆

Ponieważ możesz układać je jeden na drugim, możesz wykonać następujące czynności:


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

co w rzeczywistości jest:

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

To samo dotyczy umieszczania rzeczy pod spodem:


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



w rzeczywistości jest to:

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

W Unicode głównym blokiem łączenia znaków diakrytycznych dla języków europejskich i międzynarodowego alfabetu fonetycznego jest U + 0300 – U + 036F.

Więcej o tym tutaj

Aby utworzyć listę łączących znaków diakrytycznych, możesz użyć następującego skryptu (ponieważ linki wciąż umierają)

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

Sprawdź je również



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

Matas Vaitkevicius
źródło
2
jak byś to napisał?
Aequitas
6
@Aequitas Jeśli pytasz o ALTkody, nie możesz tego zrobić, po prostu wklejasz y&#x0306;&#x0306;tam, gdzie dostaje się do „czystego” HTML, a przeglądarka robi magię ...
Matas Vaitkevicius,
2
@barbsan Cześć, dzięki za poinformowanie mnie, zastąpiłem go skryptem, który je generuje.
Matas Vaitkevicius
Zastanawiam się, dlaczego wybrałeś ten konkretny przykład Y z tyldą. W rzeczywistości ma to pewne znaczenie w języku rosyjskim, nie jestem pewien, czy jesteś z tym zaznajomiony.
SergeyA
@SergeyA Myślę, że używa tego przykładu, ponieważ jest to ten sam przykład, z którego korzysta połączona strona wikipedia ( en.wikipedia.org/wiki/Combining_character ).
Mischa