กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้
Ostatnio pojawiły się w sekcjach komentarzy na Facebooku.
Jak możemy to oczyścić?
Odpowiedzi:
To postać z serią łączących się postaci . Ponieważ kombinowane znaki, o których mowa, chcą wyjść powyżej znaku podstawowego, nakładają się (dosłownie). Na przykład sprawa
ก้้้้้้้้้้้้้้้้้้้้
... to ก (tajski znak ko kai ) ( U + 0E01 ), po którym następuje 20 kopii tajskiego łączącego znak mai tho ( U + 0E49 ).
Państwo mogli wstępnie przetworzyć tekst i ograniczyć liczbę łączących znaków, które można zastosować do pojedynczego znaku, ale wysiłek nie może być warta nagrody. Potrzebowałbyś arkuszy danych dla wszystkich obecnych znaków, aby wiedzieć, czy są one łączone, czy co, i musisz zezwolić na co najmniej kilka, ponieważ niektóre języki są zapisane kilkoma znakami diakrytycznymi na jednej podstawie . Teraz, jeśli chcesz ograniczyć komentarze do zestawu znaków łacińskich, byłoby to łatwiejsze do sprawdzenia zakresu, ale oczywiście jest to tylko opcja, jeśli chcesz ograniczyć komentarze tylko do kilku języków. Więcej informacji, arkusze kodów itp. Na unicode.org .
BTW, jeśli kiedykolwiek chciałbyś wiedzieć, jak została skomponowana jakaś postać, dla innego pytania niedawno zakodowałem szybką i brudną stronę „Unicode Show Me” w JSBin. Po prostu skopiuj i wklej tekst do obszaru tekstowego, a zobaczysz wszystkie punkty kodowe (~ znaki), z których składa się tekst, wraz z linkami, takimi jak te powyżej, do strony opisującej każdy znak. Działa tylko dla punktów kodowych w zakresie U + FFFF i poniżej, ponieważ jest napisane w JavaScript i aby obsłużyć znaki powyżej U + FFFF w JavaScript, musisz wykonać więcej pracy niż chciałem zrobić dla tego pytania (ponieważ w JavaScript, a „znak” jest zawsze 16 bitów, co oznacza, że w niektórych językach znak można podzielić na dwa oddzielne „znaki” JavaScript, czego nie uwzględniłem), ale jest to przydatne w przypadku większości tekstów ...
źródło
Jeśli masz silnik wyrażeń regularnych z przyzwoitą obsługą Unicode, czyszczenie tego rodzaju ciągów jest trywialne. Na przykład w Perlu możesz usunąć wszystkie znaki łączenia oprócz pierwszego z każdego znaku (postrzeganego przez użytkownika) w następujący sposób:
#!/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");
Spowoduje to wydrukowanie:
กิ ก้ ก็ ก็ กิ ก้ ก็ กิ ก้ กิ ก้ ก็ ก็ กิ ก้ ก็ กิ ก้
źródło
<base><macron><overline><macron><overline>...
. Tak więc, jeśli twój tekst wymaga wielu różnych łączących się znaków, przejdzie dobrze; a złośliwy tekst nadal mógłby zostać utworzony.„Jak możemy to odkażać” najlepiej odpowiada powyżej TJ Crowder
Uważam jednak, że sanityzacja jest złym podejściem i Cristy ma rację z
overflow:hidden
elementem zawierającym css.Przynajmniej tak to rozwiązuję.
źródło
Okej, zajęło mi to trochę czasu, miałem wrażenie, że łączenie znaków w celu wyprodukowania zalgo ogranicza się do tych . Spodziewałem się więc, że podążanie za wyrażeniem regularnym złapie dziwaków.
i to nie zadziałało ...
Problem polega na tym, że lista na wiki nie obejmuje pełnego zakresu łączonych postaci.
To, co dało mi wskazówkę, to
"ก้้้้้้้้้้้้้้้้้้้้".charCodeAt(2).toString(16)
= "e49", które nie będąc w zasięgu łączenia, zalicza się do „użytku prywatnego”.W C # podlegają one
UnicodeCategory.NonSpacingMark
i następujący skrypt je opróżnia:Patrząc na wygenerowany stół, powinieneś być w stanie zobaczyć, które z nich układają się w stos. Jeden zakres, którego brakuje na wiki, jest
06D6-06DC
inny0730-0749
.AKTUALIZACJA:
Oto zaktualizowane wyrażenie regularne, które powinno wyłowić wszystkie zalgo, w tym pominięte w „normalnym” zakresie.
Najtrudniej jest je zidentyfikować, kiedy już to zrobisz - istnieje wiele rozwiązań, w tym kilka dobrych powyżej.
Mam nadzieję, że zaoszczędzi ci to trochę czasu.
źródło
([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]{2,})
nie działa. Czy nie jest interesujące, że łączenie Unicode nie ogranicza się do tego, co jest na wiki? Co rozumiesz przez „pytanie z utraconą odpowiedzią”? EDYCJA : Może wydawać się dziwne, aby dodać odpowiedź na pytanie 3-latka, ale ponieważ zajęło mi trochę czasu, zanim zrozumiałem, dlaczego ten rodzaj zalgo działał, nie mogłem pozwolić, aby taka wiedza poszła na marne. Następny facet zaoszczędzi trochę czasu.