unicode - scary - ¿Por qué esos caracteres tailandeses se muestran en la página web con una larga cola?
zalgo text app (4)
ด้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้ д ด็็็็็้้้้้็็็็้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้
Encontré algunos personajes interesantes justo cuando pegué arriba, lo cual toma solo 3 espacios de ancho. Sin embargo, la longitud real de la cadena es 380.
Inspeccioné la cadena en python, y la cadena de codificación es la siguiente:
''/ xe0 / xb8 / x94 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xd0 / xb4 / xe0 / xb8 / x94 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb 9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x87 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 / xe0 / xb9 / x89 ''
Parece que la cadena es una combinación de tres caracteres tailandeses:
ด /xe0/xb8/x94 THAI CHARACTER DO DEK
้ /xe0/xb9/x89 THAI CHARACTER MAI THO
็ /xe0/xb9/x87 THAI CHARACTER MAITAIKHU
Y mis preguntas son:
- ¿Por qué el comportamiento de esos personajes es tan diferente? ¿Es un error?
- ¿Cómo puedo evitarlo en el sitio (quizás con algún filtro html)?
ACTUALIZAR
He probado los personajes con más navegadores, y la cola larga solo aparece en Chrome y Firefox en la plataforma de Windows.
Lo que sigue es una captura de pantalla que he tomado:
ganar 7 ie8
ubuntu firefox
ganar 7 cromo
ganar 7 firefox
Por lo tanto, supongo que es un error relacionado con el navegador.
Hay dos problemas, uno en el sistema de salida (renderizador de fuente) que no es consciente de Tailandés y otro en el sistema de entrada que generó este texto en primer lugar.
Si hubieras hecho tu tarea, sabrías que mai tho y maitaikhu (nombres UniCode) son lo que UniCode denomina marcadores no espaciadores (NSM). Esto significa que el renderizador de fuentes no debe moverse a la celda del siguiente caracter cuando se muestre este glifo.
Para evitar el desorden que ves arriba, el Thai API Consortium (TAPIC) creó el estándar WTT 2.0 que describe cómo el algoritmo de representación de fuentes debería manejar el orden de las letras tailandesas cuando lo recibe como entrada y cómo el método de entrada debería permitir tales caracteres a ingresar si intenta escribirlos.
Normalización e implementaciones del lenguaje tailandés
libthai incluye métodos de entrada y salida.
thaicheck es un pequeño programa que puede detectar problemas de secuencia de letras y solucionarlos.
Por cierto, no puedes tener una secuencia (palabra) de do dek, mai tho y maitaikhu; la secuencia de entrada es ruido.
Tenga en cuenta que algunos editores han roto los métodos de entrada que permiten escribir múltiples NSM que no se pueden combinar, pero el método de salida solo procesará las secuencias legales; el resultado es una cadena de entrada ilegal que se ve bien para el usuario en su sistema .
Lo que has encontrado se llama Combinar Personajes o como gente común lo llama Zalgo
.
Funciona porque Unicode permite combinar caracteres mediante la adición de marcas diacríticas después del carácter .
Cualquier sistema que use Unicode funcionará con estos caracteres.
Los códigos que mencionas están todos en UTF-8, por lo que cada personaje necesita 3 bytes. Los códigos Unicode respectice son:
Los dos últimos están en la categoría Mark, Nonspacing
, y tienen la propiedad Combine
( Canonical_Combining_Class ) establecida en 107, lo que significa que los puntos de código se combinan con el punto de código anterior en la representación.
Su ejemplo comienza con un solo carácter y agrega muchas marcas que no dejan espacio encima.
Compare con este código C #:
char DODEK = (char)0x0e14;
char MAITHO = (char)0x0e49;
char MAITAIKHU = (char)0x0e47;
string thai = new string(new char[] { DODEK, MAITHO, MAITAIKHU });
Console.WriteLine("number of code points: " + thai.Length);
var si = new System.Globalization.StringInfo(thai);
Console.WriteLine("number of text elements: " + si.LengthInTextElements);
Salida:
number of code points: 3
number of text elements: 1
Ver también clase .Net StringInfo .
Nunca se supone que combine cientos de caracteres Unicode en un único carácter gráfico, aunque los formatos unicode lo permiten técnicamente; por lo general, no combina más de 2 o 3 caracteres.
En tailandés, tiene vocales y marcas de tono, que se muestran por encima del carácter del consonante (a veces las vocales aparecen a continuación, o incluso alrededor de los caracteres del consonante ...). Es un poco como acentos sobre vocales en francés (é, è ...) o diéresis en alemán. No es normal tener más de dos signos en tailandés (y más de uno en francés o alemán). Significa que su entrada es un texto tailandés ilegal (tal vez escrito para proporcionar algunos efectos gráficos divertidos, como "arte ASCII"). No me sorprende que ese texto ilegal se interprete de manera diferente según el navegador.