กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็ ็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้
Ceux-ci ont récemment apparu dans les sections de commentaires de Facebook.
Comment pouvons-nous désinfecter cela?
Quoi de neuf avec ces caractères unicode?
C'est un caractère avec une série de combinaisons de caractères . Parce que les caractères combinés en question veulent aller au-dessus du caractère de base, ils s'empilent (littéralement). Par exemple, le cas de
ก้้้้้้้้้้้้้้้้้้้้
... c’est un character (caractère thaïlandais ko kai ) ( U + 0E01 ) suivi de 20 copies du Caractère thaïlandais combinant mai tho ( U + 0E49 ).
Comment pouvons-nous désinfecter cela?
Vous pouvez prétraiter le texte et limiter le nombre de caractères de combinaison pouvant être appliqués à un seul caractère, mais l'effort risque de ne pas valoir la peine. . Vous auriez besoin des feuilles de données pour tous les caractères actuels afin de savoir si elles étaient combinées ou autre chose, et vous devez en autoriser au moins quelques-unes, car certaines langues sont écrites avec plusieurs signes diacritiques sur une même base. . Désormais, si vous souhaitez limiter les commentaires au jeu de caractères latins, ce serait une vérification de plage plus simple, 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 .
En passant, si vous voulez savoir comment un personnage a été composé, pour une autre question, je viens de coder une page page "Unicode Show Me" rapide et sale sur JSBin. Il vous suffit de copier et coller le texte dans la zone de texte pour afficher 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 en dessous, car il est écrit en JavaScript et pour gérer les caractères supérieurs à U + FFFF en JavaScript, vous devez faire plus de travail que je ne le voulais pour cette question (parce qu'en JavaScript, "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 pris en compte ça), mais c'est pratique pour la plupart des textes ...
Si vous avez un moteur regex avec un support Unicode décent, il est trivial de désinfecter ce type de chaîne. En Perl, par exemple, vous pouvez supprimer tous les caractères (perçus par l'utilisateur) de la manière suivante:
#!/usr/bin/Perl
use strict;
use utf8;
binmode(STDOUT, ':utf8');
my $string = "กิิ ก้้ ก็็ ก็็ กิิ ก้้ ก็็ กิิ ก้้ กิิ ก้้ ก็็ ก็็ กิิ ก้้ ก็็ กิิ ก้้";
$string =~ s/(\p{Mark})\p{Mark}+/$1/g; # Strip excess combining marks
print("$string\n");
Cela va imprimer:
"Comment pouvons-nous désinfecter cela", répond mieux ci-dessus par T.J Crowder
Cependant, je pense que la désinfection n’est pas la bonne approche et Cristy a raison avec overflow:hidden
sur l'élément contenant le css.
Au moins, c'est comme ça que je le résous.
Ok, celui-ci m’a pris du temps à comprendre, j’avais l’impression que la combinaison de caractères pour produire du zalgo est limitée à ceux-ci . Donc je m'attendais à suite à l'expression régulière pour attraper les monstres.
([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]{2,})
et ça n'a pas marché ...
Le problème est que liste dans le wiki ne couvre pas toute la gamme des caractères de combinaison.
Ce qui m'a donné un indice, c'est "ก้้้้้้้้้้้้้้้้้้้้".charCodeAt(2).toString(16)
= "e49", qui ne fait pas partie d'une plage de combinaisons, il entre dans la catégorie "Usage privé".
En C #, ils tombent sous UnicodeCategory.NonSpacingMark
Et le script suivant les efface:
[Test]
public void IsZalgo()
{
var zalgo = new[] { UnicodeCategory.NonSpacingMark };
File.Delete("IsModifyLike.html");
File.AppendAllText("IsModifyLike.html", "<table>");
for (var i = 0; i < 65535; i++)
{
var c = (char)i;
if (zalgo.Contains(Char.GetUnicodeCategory(c)))
{
File.AppendAllText("IsModifyLike.html", string.Format("<tr><td>{0}</td><td>{1}</td><td>{2}</td><td>A&#{3};&#{3};&#{3}</td></tr>\n", i.ToString("X"), c, Char.GetUnicodeCategory(c), i));
}
}
File.AppendAllText("IsModifyLike.html", "</table>");
}
En regardant le tableau généré, vous devriez pouvoir voir ceux qui se superposent. Une plage manquante sur le wiki est 06D6-06DC
, Une autre 0730-0749
.
UPDATE:
Voici la regex mise à jour qui devrait récupérer tous les zalgo, y compris ceux qui ont été contournés dans la plage "normale".
([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F\u0483-\u0486\u05C7\u0610-\u061A\u0656-\u065F\u0670\u06D6-\u06ED\u0711\u0730-\u073F\u0743-\u074A\u0F18-\u0F19\u0F35\u0F37\u0F72-\u0F73\u0F7A-\u0F81\u0F84\u0e00-\u0eff\uFC5E-\uFC62]{2,})
Le plus difficile est de les identifier, une fois que vous avez fait cela - il existe une multitude de solutions, y compris les bonnes ci-dessus.
J'espère que cela vous fait gagner du temps.