J'ai vu un texte étrangement formaté appelé Zalgo comme ci-dessous écrit sur divers forums. C'est un peu ennuyeux à regarder, mais ça me dérange vraiment parce que cela mine ma notion de ce qu'un personnage est censé être. Ma compréhension est qu'un personnage est censé se déplacer horizontalement sur une ligne et rester dans un certain "conteneur". Évidemment, le texte Zalgo se déplace verticalement et ne semble pas être limité à aucun espace.
Est-ce un bug / défaut / exploit / hack dans Unicode? Ces personnages individuels ont-ils des propriétés étranges? "Que se passe-t-il ici?
H̡̫̤̤̣͉̤ͭ̓̓̇͗̎̀ơ̯̗̱̘̮͒̄̀̈ͤ̀͡w͓̲͙͖̥͉̹͋ͬ̊ͦ̂̀̚ ͎͉͖̌ͯͅͅd̳̘̿̃̔̏ͣ͂̉̕ŏ̖̙͋ͤ̊͗̓͟͜e͈͕̯̮̙̣͓͌ͭ̍̐̃͒s͙͔̺͇̗̱̿̊̇͞ ̸̤͓̞̱̫ͩͩ͑̋̀ͮͥͦ̊Z̆̊͊҉҉̠̱̦̩͕ą̟̹͈̺̹̋̅ͯĺ̡̘̹̻̩̩͋͘g̪͚͗ͬ͒o̢̖͇̬͍͇͓̔͋͊̓ ̢͈͙͂ͣ̏̿͐͂ͯ͠t̛͓̖̻̲ͤ̈ͣ͝e͋̄ͬ̽͜҉͚̭͇ͅx͎̬̠͇̌ͤ̓̂̓͐͐́͋͡ț̗̹̝̄̌̀ͧͩ̕͢ ̮̗̩̳̱̾w͎̭̤͍͇̰̄͗ͭ̃͗ͮ̐o̢̯̻̰̼͕̾ͣͬ̽̔̍͟ͅr̢̪͙͍̠̀ͅǩ̵̶̗̮̮ͪ́? ̙͉̥̬͙̟̮͕ͤ̌͗ͩ̕͡
Réponses:
Le texte utilise des caractères de combinaison, également appelés marques de combinaison. Voir la section 2.11 de Combinaison de caractères dans la norme Unicode (PDF).
Dans Unicode, le rendu des caractères n'utilise pas un modèle de cellule de caractère simple où chaque glyphe s'inscrit dans une boîte avec une hauteur donnée. La combinaison des marques peut être rendue au-dessus, en dessous ou à l'intérieur d'un caractère de base
Ainsi, vous pouvez facilement construire une séquence de caractères, composée d'un caractère de base et de marques «combinant au-dessus», de n'importe quelle longueur, pour atteindre la hauteur visuelle souhaitée, en supposant que le logiciel de rendu est conforme au modèle de rendu Unicode. Une telle séquence n'a bien sûr pas de sens, et même un singe pourrait la produire (par exemple, étant donné un clavier avec un pilote approprié).
Et vous pouvez mélanger les marques «combinaison ci-dessus» et «combinaison ci-dessous».
L'exemple de texte de la question commence par:
H
ͭ
̓
̓
̇
la source
U+1F4A9
.Le texte Zalgo fonctionne grâce à la combinaison de caractères. Ce sont des caractères spéciaux qui permettent de modifier le caractère précédent.
OU
y + ̆ = y̆ qui est en fait
Comme vous pouvez les empiler les uns sur les autres, vous pouvez produire les éléments suivants:
y̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆
qui est en fait:
Il en va de même pour mettre des trucs en dessous:
y̰̰̰̰̰̰̰̰̰̰̰̰̰̰̰̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆
c'est en fait:
En Unicode, le bloc principal de la combinaison des signes diacritiques pour les langues européennes et l'alphabet phonétique international est U + 0300 – U + 036F.
En savoir plus ici
Pour produire une liste de combinaison de signes diacritiques, vous pouvez utiliser le script suivant (car les liens continuent de mourir)
Consultez-les également
Mͣͭͣ̾ Vͣͥͭ͛ͤͮͥͨͥͧ̾
la source
ALT
codes, vous ne pouvez pas le faire, vous colleriez simplementy̆̆
là où il entre en HTML «pur» et le navigateur ferait sa magie ...