กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้
Recentemente, eles apareceram nas seções de comentários do Facebook.
Como podemos higienizar isso?
Respostas:
É um personagem com uma série de personagens combinados . Como os caracteres combinados em questão querem ir acima do caractere base, eles se acumulam (literalmente). Por exemplo, o caso de
ก้้้้้้้้้้้้้้้้้้้้
... é um ก (caractere tailandês ko kai ) ( U + 0E01 ) seguido por 20 cópias do caractere combinatório tailandês mai tho ( U + 0E49 ).
Você pode pré-processar o texto e limitar o número de caracteres combinados que podem ser aplicados a um único personagem, mas o esforço pode não valer a recompensa. Você precisaria das folhas de dados de todos os caracteres atuais para saber se eles estavam se combinando ou o quê, e você precisaria ter certeza de permitir pelo menos alguns porque alguns idiomas são escritos com vários diacríticos em uma única base . Agora, se você quiser limitar os comentários ao conjunto de caracteres latinos, seria uma verificação de intervalo mais fácil, mas é claro que é apenas uma opção se você quiser limitar os comentários a apenas alguns idiomas. Mais informações, planilhas de código, etc. em unicode.org .
Aliás, se você quiser saber como algum personagem foi composto, para outra pergunta recentemente eu codifiquei uma página "Unicode Show Me" rápida e suja no JSBin. Você apenas copia e cola o texto na área de texto, e ele mostra todos os pontos de código (~ caracteres) dos quais o texto é composto, com links como os acima para a página que descreve cada caractere. Ele só funciona para pontos de código no intervalo U + FFFF e abaixo, porque é escrito em JavaScript e para lidar com caracteres acima de U + FFFF em JavaScript, você tem que fazer mais trabalho do que eu queria para essa questão (porque em JavaScript, um "personagem" é sempre 16 bits, o que significa que para alguns idiomas um caractere pode ser dividido em dois "caracteres" JavaScript separados e eu não levei em consideração isso), mas é útil para a maioria dos textos ...
fonte
Se você tiver um mecanismo regex com suporte decente a Unicode, é trivial limpar esse tipo de string. Em Perl, por exemplo, você pode remover tudo, exceto a primeira marca de combinação de cada caractere (percebido pelo usuário) como este:
Isso irá imprimir:
กิ ก้ ก็ ก็ กิ ก้ ก็ กิ ก้ กิ ก้ ก็ ก็ กิ ก้ ก็ กิ ก้
fonte
<base><macron><overline><macron><overline>...
. Portanto, se o seu texto precisa de vários caracteres de combinação diferentes , ele passará bem; e o texto malicioso ainda pode ser criado."Como podemos higienizar isso" é melhor respondido acima por TJ Crowder
No entanto, acho que a higienização é a abordagem errada, e Cristy acertou
overflow:hidden
no elemento que contém o css.Pelo menos, é assim que estou resolvendo.
fonte
Ok, este me levou um tempo para descobrir, eu estava com a impressão de que combinar personagens para produzir zalgo se limita a eles . Então eu esperava que seguir o regex pegasse os malucos.
e não funcionou ...
O problema é que a lista no wiki não cobre uma gama completa de caracteres combinados.
O que me deu uma dica é
"ก้้้้้้้้้้้้้้้้้้้้".charCodeAt(2).toString(16)
= "e49", que não está dentro de uma faixa de combinação, cai em 'Uso privado'.Em C # eles se enquadram
UnicodeCategory.NonSpacingMark
e o seguinte script os elimina:Observando a tabela gerada, você poderá ver quais são empilhadas. Um intervalo que está faltando no wiki é
06D6-06DC
outro0730-0749
.ATUALIZAR:
Aqui está o regex atualizado que deve pescar todos os zalgo, incluindo aqueles contornados na faixa 'normal'.
A parte mais difícil é identificá-los, uma vez que você tenha feito isso - há uma infinidade de soluções, incluindo algumas boas acima.
Espero que isso economize algum tempo.
fonte
([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]{2,})
não funciona. Você não acha interessante que empilhar Unicode não se limita ao que está no wiki? O que você quer dizer com 'pergunta perdida respondida'? EDIT : Você pode achar estranho adicionar uma resposta a uma pergunta de 3 anos, mas como demorei um pouco para descobrir por que esse tipo de zalgo funcionava, não poderia deixar esse conhecimento desperdiçar. O próximo cara vai economizar tempo.