กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้
Ceux-ci sont récemment apparus dans les sections de commentaires Facebook.
Comment pouvons-nous désinfecter cela?
Réponses:
C'est un personnage avec une série de personnages combinés . Parce que les caractères de combinaison en question veulent aller au-dessus du caractère de base, ils s'empilent (littéralement). Par exemple, le cas de
ก้้้้้้้้้้้้้้้้้้้้
... c'est un ก (caractère thaï ko kai ) ( U + 0E01 ) suivi de 20 copies du caractère combinant thaïlandais mai tho ( U + 0E49 ).
Vous pouvez prétraiter le texte et limiter le nombre de caractères de combinaison pouvant être appliqués à un seul personnage, mais l'effort ne vaut peut-être pas la peine. Vous auriez besoin des fiches techniques pour tous les caractères actuels afin de savoir s'ils se combinent ou quoi, et vous devez vous assurer d'en autoriser au moins quelques-uns car certaines langues sont écrites avec plusieurs signes diacritiques sur une seule base . Désormais, si vous souhaitez limiter les commentaires au jeu de caractères latins, ce serait une vérification de plage plus facile, mais bien sûr, ce n'est qu'une option si vous souhaitez limiter les commentaires à quelques langues. Plus d'informations, feuilles de code, etc. sur unicode.org .
BTW, si vous voulez savoir comment un personnage a été composé, pour une autre question, j'ai récemment codé une page "Unicode Show Me" rapide et sale sur JSBin. Il vous suffit de copier et coller le texte dans la zone de texte, et cela vous montre tous les points de code (~ caractères) dont le texte est composé, avec des liens tels que ceux ci-dessus vers la page décrivant chaque caractère. Cela ne fonctionne que pour les points de code dans la plage U + FFFF et moins, car il est écrit en JavaScript et pour gérer les caractères au-dessus de U + FFFF en JavaScript, vous devez faire plus de travail que je ne le souhaitais pour cette question (car en JavaScript, un "caractère" est toujours 16 bits, ce qui signifie que pour certaines langues, un caractère peut être divisé en deux "caractères" JavaScript distincts et je n'ai pas tenu compte de cela), mais c'est pratique pour la plupart des textes ...
la source
Si vous avez un moteur regex avec un support Unicode décent, il est trivial de nettoyer ce type de chaînes. En Perl, par exemple, vous pouvez supprimer tout sauf la première marque de combinaison de chaque caractère (perçu par l'utilisateur) comme ceci:
Cela imprimera:
กิ ก้ ก็ ก็ กิ ก้ ก็ กิ ก้ กิ ก้ ก็ ก็ กิ ก้ ก็ กิ ก้
la source
<base><macron><overline><macron><overline>...
. Donc, si votre texte a besoin de plusieurs caractères de combinaison différents , il passera bien; et du texte malveillant pourrait encore être créé."Comment pouvons-nous désinfecter cela" est mieux répondu ci-dessus par TJ Crowder
Cependant, je pense que la désinfection est la mauvaise approche, et Cristy a raison avec
overflow:hidden
l'élément contenant le css.Du moins, c'est comme ça que je résous le problème.
la source
Ok celui-ci m'a pris du temps à comprendre, j'avais l'impression que combiner des personnages pour produire du zalgo se limitait à ceux-ci . Je m'attendais donc à ce que les regex suivantes attrapent les monstres.
et ça n'a pas marché ...
Le hic, c'est que la liste du wiki ne couvre pas la gamme complète de combinaisons de caractères.
Ce qui m'a donné un indice, c'est
"ก้้้้้้้้้้้้้้้้้้้้".charCodeAt(2).toString(16)
= "e49" qui, en dehors d'une plage de combinaison, tombe dans «Usage privé».En C #, ils tombent sous
UnicodeCategory.NonSpacingMark
et le script suivant les élimine:En regardant la table générée, vous devriez être en mesure de voir lesquels se superposent. Une plage qui manque sur le wiki en est
06D6-06DC
une autre0730-0749
.METTRE À JOUR:
Voici une regex mise à jour qui devrait pêcher tous les zalgo, y compris ceux contournés dans la plage `` normale ''.
Le plus difficile est de les identifier, une fois que vous avez fait cela - il existe une multitude de solutions, y compris certaines bonnes ci-dessus.
J'espère que cela vous fera gagner du temps.
la source
([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]{2,})
ne fonctionne pas. Ne trouvez-vous pas intéressant que l'empilement d'unicode ne se limite pas à ce qui se trouve sur le wiki? Qu'entendez-vous par «question à réponse perdue»? EDIT : Vous pourriez trouver étrange d'ajouter une réponse à une question de 3 ans, mais comme il m'a fallu un certain temps pour comprendre pourquoi ce type de zalgo fonctionnait, je ne pouvais pas laisser une telle connaissance se perdre. Le prochain gars gagnera du temps.