กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้
Diese wurden kürzlich in Facebook-Kommentarbereichen angezeigt.
Wie können wir das sanieren?
Antworten:
Das ist ein Charakter mit einer Reihe von kombinierten Charakteren . Da die fraglichen kombinierenden Zeichen über das Basiszeichen hinausgehen möchten, stapeln sie sich (im wahrsten Sinne des Wortes). Zum Beispiel der Fall von
ก้้้้้้้้้้้้้้้้้้้้
... es ist ein ก (thailändisches Zeichen ko kai ) ( U + 0E01 ), gefolgt von 20 Kopien des thailändischen Kombinationszeichens mai tho ( U + 0E49 ).
Sie können den Text und begrenzen die Anzahl der Kombinationszeichen Vorprozess, die auf ein einzelnes Zeichen angewendet werden kann, aber der Aufwand ist vielleicht nicht die Belohnung wert sein. Sie benötigen die Datenblätter für alle aktuellen Zeichen, damit Sie wissen, ob sie kombiniert wurden oder was, und Sie müssen mindestens einige zulassen, da einige Sprachen mit mehreren diakritischen Zeichen auf einer einzigen Basis geschrieben sind . Wenn Sie Kommentare auf den lateinischen Zeichensatz beschränken möchten, ist dies eine einfachere Bereichsprüfung. Dies ist jedoch nur dann eine Option, wenn Sie Kommentare auf wenige Sprachen beschränken möchten. Weitere Informationen, Codeblätter usw. unter unicode.org .
Übrigens, wenn Sie jemals wissen wollen, wie ein Charakter zusammengesetzt wurde, habe ich kürzlich für eine andere Frage eine schnelle und schmutzige "Unicode Show Me" -Seite auf JSBin codiert. Sie kopieren einfach den Text und fügen ihn in den Textbereich ein. Daraufhin werden alle Codepunkte (~ Zeichen) angezeigt, aus denen der Text besteht, mit Links wie den oben genannten zu der Seite, auf der die einzelnen Zeichen beschrieben werden. Es funktioniert nur für Codepunkte im Bereich U + FFFF und darunter, da es in JavaScript geschrieben ist und um Zeichen über U + FFFF in JavaScript zu verarbeiten, müssen Sie mehr Arbeit leisten, als ich für diese Frage wollte (weil in JavaScript a "Charakter" ist immer 16 Bit, was bedeutet, dass für einige Sprachen ein Zeichen auf zwei separate JavaScript- "Zeichen" aufgeteilt werden kann und ich das nicht berücksichtigt habe), aber es ist praktisch für die meisten Texte ...
quelle
Wenn Sie eine Regex-Engine mit anständiger Unicode-Unterstützung haben, ist es trivial, diese Art von Zeichenfolgen zu bereinigen. In Perl können Sie beispielsweise alle bis auf die erste Kombinationsmarke von jedem (vom Benutzer wahrgenommenen) Zeichen wie folgt entfernen:
Dies wird gedruckt:
กิ ก้ ก็ ก็ กิ ก้ ก็ กิ ก้ กิ ก้ ก็ ก็ ก็ กิ ก้ ก็ กิ ก้
quelle
<base><macron><overline><macron><overline>...
. Wenn Ihr Text also mehrere verschiedene Kombinationszeichen benötigt, wird er gut durchlaufen. und bösartiger Text könnte noch erstellt werden."Wie können wir das desinfizieren?" Wird am besten oben von TJ Crowder beantwortet
Ich denke jedoch, dass Desinfektion der falsche Ansatz ist, und Cristy hat es richtig mit
overflow:hidden
dem CSS-haltigen Element.Zumindest löse ich das so.
quelle
Ok, ich habe eine Weile gebraucht, um das herauszufinden. Ich hatte den Eindruck, dass die Kombination von Charakteren zur Herstellung von Zalgo auf diese beschränkt ist . Also erwartete ich, dass Regex die Freaks fangen würde.
und es hat nicht funktioniert ...
Der Haken ist, dass die Liste im Wiki nicht die gesamte Bandbreite der kombinierten Zeichen abdeckt.
Was mir einen Hinweis gab, ist
"ก้้้้้้้้้้้้้้้้้้้้".charCodeAt(2).toString(16)
= "e49", was nicht in einem Kombinationsbereich liegt, sondern in den "privaten Gebrauch" fällt.In C # fallen sie unter
UnicodeCategory.NonSpacingMark
und das folgende Skript löscht sie aus:Wenn Sie sich die generierte Tabelle ansehen, sollten Sie sehen können, welche stapeln. Ein Bereich, der im Wiki fehlt, ist ein
06D6-06DC
anderer0730-0749
.AKTUALISIEREN:
Hier ist ein aktualisierter Regex , der alle Zalgo herausfischen sollte, einschließlich derjenigen, die im "normalen" Bereich umgangen wurden.
Am schwierigsten ist es, sie zu identifizieren, sobald Sie dies getan haben - es gibt eine Vielzahl von Lösungen, einschließlich einiger guter oben.
Hoffe das spart dir etwas Zeit.
quelle
([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]{2,})
nicht funktioniert. Finden Sie es nicht interessant, dass das Stapeln von Unicode nicht auf das beschränkt ist, was im Wiki vorhanden ist? Was meinst du mit "verlorene beantwortete Frage"? EDIT : Es mag seltsam sein, eine Antwort auf eine 3 Jahre alte Frage hinzuzufügen, aber da ich eine Weile gebraucht habe, um herauszufinden, warum diese Art von Zalgo funktioniert, konnte ich nicht zulassen, dass dieses Wissen verschwendet wurde. Der nächste Typ wird etwas Zeit sparen.