Voy a preguntar lo que probablemente sea una pregunta bastante controvertida: "¿Debería una de las codificaciones más populares, UTF-16, considerarse nociva?"
¿Por qué hago esta pregunta?
¿Cuántos programadores son conscientes del hecho de que UTF-16 es en realidad una codificación de longitud variable? Con esto quiero decir que hay puntos de código que, representados como pares sustitutos, toman más de un elemento.
Lo sé; muchas aplicaciones, frameworks y API usan UTF-16, como String de Java, String de C #, Win32 API, bibliotecas Qt GUI, la biblioteca ICU Unicode, etc. Sin embargo, con todo eso, hay muchos errores básicos en el procesamiento de caracteres fuera de BMP (caracteres que deben codificarse utilizando dos elementos UTF-16).
Por ejemplo, intente editar uno de estos caracteres:
- 𝄞 ( U + 1D11E ) SÍMBOLO MUSICAL G CLEF
- 𝕥 ( U + 1D565 ) MATEMÁTICA DE DOBLE ESTRUCTURA PEQUEÑA T
- 𝟶 ( U + 1D7F6 ) MONOESPACIO DIGITAL MATEMÁTICO CERO
- 𠂊 ( U + 2008A ) Personaje Han
Puede perder algunos, dependiendo de las fuentes que haya instalado. Todos estos personajes están fuera del BMP (Plano multilingüe básico). Si no puede ver estos caracteres, también puede intentar mirarlos en la referencia de caracteres Unicode .
Por ejemplo, intente crear nombres de archivo en Windows que incluyan estos caracteres; intente eliminar estos caracteres con un "espacio de retroceso" para ver cómo se comportan en diferentes aplicaciones que usan UTF-16. Hice algunas pruebas y los resultados son bastante malos:
- Opera tiene problemas para editarlos (eliminar requiere 2 prensas en el espacio de retroceso)
- El Bloc de notas no puede manejarlos correctamente (eliminar las 2 pulsaciones requeridas en el espacio de retroceso)
- Edición de nombres de archivo en cuadros de diálogo de Windows en roto (eliminar requiere 2 prensas en el espacio de retroceso)
- Todas las aplicaciones QT3 no pueden lidiar con ellas: muestra dos cuadrados vacíos en lugar de un símbolo.
- Python codifica dichos caracteres incorrectamente cuando se usa directamente
u'X'!=unicode('X','utf-16')
en algunas plataformas cuando X en caracteres fuera de BMP. - Python 2.5 unicodedata no puede obtener propiedades en dichos caracteres cuando python se compila con cadenas Unicode UTF-16.
- StackOverflow parece eliminar estos caracteres del texto si se editan directamente como caracteres Unicode (estos caracteres se muestran usando escapes Unicode HTML).
- WinForms TextBox puede generar una cadena no válida cuando se limita con MaxLength.
Parece que tales errores son extremadamente fáciles de encontrar en muchas aplicaciones que usan UTF-16.
Entonces ... ¿Crees que UTF-16 debería considerarse dañino?