tabla - ¿Lista de caracteres Unicode que deberían filtrarse en la salida?
utf-8 encoding (4)
Recientemente tuve un error debido a la calidad de los datos con el soporte del navegador, y estoy buscando una regla segura para aplicar escape de cadena sin doble tamaño a menos que sea necesario.
Una secuencia de bytes UTF-8 "E2-80-A8" (U + 2028, SEPARADOR DE LÍNEA), un carácter perfectamente válido en una base de datos Unicode. Sin embargo, esa secuencia representa un separador de línea (Sí, aparte de "0A").
Y mal, muchos navegadores (incluidos Chrome, Firefox y Safari; no probé otros), no pudieron procesar una devolución de llamada JSONP que tiene una cadena que contiene ese carácter Unicode. El JSONP fue incluido por un HTML no Unicode que no tenía ningún control.
Los navegadores simplemente informaron un CÓDIGO VÁLIDO / error de sintaxis en dicho JavaScript que parece válido desde las herramientas de depuración y todos los editores de texto. Lo que supongo es que puede intentar convertir "E2-80-A8" a BIG-5 y rompió la sintaxis JS.
Lo anterior es solo un ejemplo de cómo Unicode puede romper su sistema inesperado. Por lo que sé, algunos hackers pueden usar RTL y otros personajes de control para su bien. Y hay muchas "citas", "espacios", "símbolos" y "controles" en la especificación Unicode.
PREGUNTA:
¿Hay una lista de caracteres Unicode para que cada programador conozca las características ocultas (y los errores) que no queremos que sean eficaces en nuestra aplicación? (Por ejemplo, Windows deshabilita RTL en nombre de archivo).
EDITAR:
No estoy pidiendo JSON ni JavaScript. Solicito las mejores prácticas generales de manejo de Unicode en todos los programas.
AZ, az y 0-9 son generalmente seguros. Fuera de esos 62 caracteres, tendrá problemas con algún sistema. No hay otra respuesta que alguien pueda darte.
Por ejemplo, mencionas nombres de dominio. La única forma de manejar los nombres de dominio Unicode es seguir el RFC 3454 y el RFC 5890-5893, y procesar los datos de esa manera y solo de esa manera. Los nombres de archivo en la mayoría de los sistemas de archivos Unix son cadenas arbitrarias de bytes que no incluyen / o / 0. Tratar funcionalmente un nombre de archivo en Unix como una cadena Unicode sin romper nada es una pregunta en sí misma. Tenga en cuenta que los nombres de archivos de Windows no son seguros para AZ; Cosas como NUL y PRN son nombres reservados. Cada dominio tiene sus propios pequeños problemas y peculiaridades, y ningún resumen simple será suficiente para todas partes.
Hay una base de datos de propiedades de caracteres y un informe que lo describe, la BASE DE DATOS DE CARACTERES DE UNICODE , que da una buena idea de cómo los navegadores "deben" tratar un punto de código. Me encanta esa palabra, "debería". Lo más seguro es que sea una lista blanca, probablemente podría ir con L | M | N | S, Letter o Mark o Number o Symbol.
Echa un vistazo al proyecto de UCI para una biblioteca.
Mira los gráficos de Unicode. Hay una lista de caracteres no imprimibles. Estos son los que podrían ser posibles alborotadores. Tu amigo U + 2028 tiene muchos amigos: http://www.unicode.org/charts/PDF/U2000.pdf Y no solo está en el rango 2000.
Usted podría eliminarlos a todos o separarlos en diferentes categorías (los caracteres SEP como U + 2028 se convierten en / n o se escaparon correctamente), etc.
HTH
Rompe javascript porque las cadenas no pueden tener nuevas líneas en ellas:
var myString = "
";
//SyntaxError: Unexpected token ILLEGAL
Ahora, la secuencia UTF-8 "E2-80-A8"
decodifica al punto de código U+2028
Unicode, que se trata de manera similar a la nueva línea en javascript:
var myString = "
";
//Syntax Error
Sin embargo, es seguro escribir
var myString = "/u2028";
//you can now log myString in console and get real representation of this character
que es lo que JSON correctamente codificado tendrá. Estudiaría la codificación correcta de JSON en lugar de mantener una lista negra de caracteres no seguros. (que son U + 2028 y U + 2029 AFAIK).
En PHP:
echo json_encode( chr(0xe2). chr(0x80).chr(0xA8 ) );
//"/u2028"