กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้
Estos aparecieron recientemente en las secciones de comentarios de Facebook.
¿Cómo podemos desinfectar esto?
Respuestas:
Ese es un personaje con una serie de personajes combinados . Debido a que los caracteres combinados en cuestión quieren ir por encima del carácter base, se acumulan (literalmente). Por ejemplo, el caso de
ก้้้้้้้้้้้้้้้้้้้้
... es un ก (carácter tailandés ko kai ) ( U + 0E01 ) seguido de 20 copias del carácter combinado tailandés mai tho ( U + 0E49 ).
Usted podría pre-procesar el texto y limitar el número de caracteres de combinación que se pueden aplicar a un solo carácter, pero el esfuerzo puede no valer la pena la recompensa. Necesitaría las hojas de datos de todos los caracteres actuales para saber si se combinan o qué, y debe asegurarse de permitir al menos algunos porque algunos idiomas están escritos con varios signos diacríticos en una sola base. . Ahora, si desea limitar los comentarios al conjunto de caracteres latinos, sería una verificación de rango más fácil, pero por supuesto, esa es solo una opción si desea limitar los comentarios a solo unos pocos idiomas. Más información, hojas de códigos, etc. en unicode.org .
Por cierto, si alguna vez quieres saber cómo se compuso algún personaje, para otra pregunta, recientemente codifiqué una página rápida y sucia "Unicode Show Me" en JSBin. Simplemente copie y pegue el texto en el área de texto, y le mostrará todos los puntos de código (~ caracteres) que componen el texto, con enlaces como los de arriba a la página que describe cada carácter. Solo funciona para puntos de código en el rango U + FFFF y menores, porque está escrito en JavaScript y para manejar caracteres por encima de U + FFFF en JavaScript, tiene que hacer más trabajo del que quería hacer para esa pregunta (porque en JavaScript, un "personaje" es siempre 16 bits, lo que significa que para algunos idiomas un carácter se puede dividir en dos "caracteres" JavaScript separados y no lo tuve en cuenta), pero es útil para la mayoría de los textos ...
fuente
Si tiene un motor de expresiones regulares con soporte Unicode decente, es trivial desinfectar este tipo de cadenas. En Perl, por ejemplo, puede eliminar todas las marcas de combinación excepto la primera de cada carácter (percibido por el usuario) de esta manera:
Esto imprimirá:
กิ ก้ ก็ ก็ กิ ก้ ก็ กิ ก้ กิ ก้ ก็ ก็ กิ ก้ ก็ กิ ก้
fuente
<base><macron><overline><macron><overline>...
. Por lo tanto, si su texto necesita varios caracteres de combinación diferentes , pasará bien; y todavía se podría crear texto malicioso."¿Cómo podemos desinfectar esto?" Se responde mejor arriba por TJ Crowder
Sin embargo, creo que la desinfección es el enfoque incorrecto, y Cristy lo tiene bien con
overflow:hidden
el elemento que contiene css.Al menos, así es como lo estoy resolviendo.
fuente
Ok, este me tomó un tiempo darme cuenta, tenía la impresión de que la combinación de personajes para producir zalgo se limita a estos . Así que esperaba que la siguiente expresión regular atrapara a los monstruos.
y no funcionó ...
El problema es que la lista en wiki no cubre la gama completa de caracteres combinados.
Lo que me dio una pista es
"ก้้้้้้้้้้้้้้้้้้้้".charCodeAt(2).toString(16)
= "e49" que, al no estar dentro de un rango de combinación, cae en 'Uso privado'.En C # caen bajo
UnicodeCategory.NonSpacingMark
y el siguiente script los elimina:Al mirar la tabla generada, debería poder ver cuáles se apilan. Un rango que falta en wiki es
06D6-06DC
otro0730-0749
.ACTUALIZAR:
Aquí está la expresión regular actualizada que debería eliminar todo el zalgo, incluidos los omitidos en el rango 'normal'.
Lo más difícil es identificarlos, una vez que haya hecho eso, hay una multitud de soluciones, incluidas algunas buenas anteriores.
Espero que esto te ahorre algo de tiempo.
fuente
([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]{2,})
no funciona la validación normal de zalgo . ¿No le parece interesante que apilar Unicode no se limite a lo que hay en wiki? ¿Qué quiere decir con "pregunta perdida contestada"? EDITAR : Puede que le resulte extraño agregar la respuesta a la pregunta de 3 años, pero como me tomó un tiempo descubrir por qué este tipo de zalgo funcionaba, no podía dejar que ese conocimiento se desperdiciara. El próximo chico ahorrará algo de tiempo.