unicode - sirve - ¿Por qué alguien usa una codificación que no sea UTF-8?
utf-8 encoding (17)
A veces están restringidos por razones históricas / no compatibles (estoy desarrollando en Windows usando Zend Studio en un recurso compartido de Samba en una caja Linux; y algo en esa mezcla significa que sigo volviendo a Cp1512 en lugar de UTF8).
A veces no necesita usar UTF-8 (por ejemplo, cuando almacena un hash md5 en una base de datos: solo necesita el rango hexadecimal 0-9 AF: ¿por qué convertirlo en un campo UTF-8, que tomará al menos un byte? almacenamiento adicional en lugar de ASCII normal).
A veces es solo la pereza aprender las funciones UTF-8 para un idioma en particular.
Quiero saber por qué cualquier desarrollador necesitaría usar una codificación que no sea UTF-8.
Bueno, algunos lo hacen porque sus herramientas son arcaicas o defectuosas. Algunos lo hacen porque no ven la necesidad de soportar nada más que ASCII. Algunos lo hacen porque no conocen nada mejor.
Esas son las excusas usuales para no usar Unicode.
En cuanto a no usar UTF-8 específicamente, existen diferentes razones. Algunos sistemas, como Windows 1 (y derivado de eso, .NET) y Java llegaron a ser en una época donde Unicode era un código estricto de 16 bits. Por lo tanto, en realidad solo había una codificación: UCS-2, codificación de puntos de código directamente como palabras de 16 bits.
Más tarde, Unicode se expandió a 21 bits porque 65536 puntos de código ya no eran suficientes. Esto provocó la aparición de codificaciones como UTF-32 y UTF-16. Para los sistemas que anteriormente trabajaban con UCS-2, la transición a UTF-16 fue la opción más fácil y sensata. Windows hizo esa transición en Ye Olde Days of Windows 2000.
Entonces, aunque creo que casi todas las aplicaciones actuales deberían ser compatibles con Unicode , no creo que sea completamente necesario que utilicen UTF-8. Hay razones históricas para eso y ningún beneficio real en la conversión de sistemas existentes de UTF-16 a UTF-8.
1 NT
Como a veces quiere operar fácilmente en puntos de código, entonces debe elegir fe UCS-2 o UCS-4.
En mi anterior empleador utilizamos iso-8859-1 para algunas de nuestras páginas ASP para que coincida con la recopilación de nuestro SQL Server, que como puede adivinar no era Unicode. Quería cambiar la intercalación, pero el gerente dijo esperar hasta que actualizamos nuestro SQL Server para hacerlo. Huelga decir que nunca sucedió, hace más de un año que no estoy con ellos, así que no sé si finalmente lo hicieron.
En relación con el tema, al usar MySQL, como si no fuera lo suficientemente complejo, tiene la opción de elegir qué tipo de intercalación UTF-8 desea usar. Entonces, ¿qué usarías?
UTF-8 general ci
o UTF-8 unicode ci
?
(Tiendo a usar la variante UTF-8 que se usa para la conexión de la base de datos)
Imagine que todos los archivos a considerar están en GB2312 (estándar de China continental). Entonces puede elegir GB18030 como codificación Unicode en su lugar. Son compatibles de la misma manera que todos los ASCII son UTF-8. ¡Eso es útil en China continental!
Quizás decida incluso más rápido cuando descubra que la ley exige (por lo que he oído) las dos normas GB mencionadas en su producto informático, si desea enviarlas a China (continental).
Otra ventaja es que GB2312, y como tal GB18030 también, también son compatibles con ASCII.
Aunque algorítmicamente no es tan robusto. - Entonces, si no tiene motivos políticos ni ningún legado GB2312, no tiene sentido usarlo. Pero si lo haces, aquí tienes tu respuesta.
Las razones para usar conjuntos / codificaciones de caracteres de 8 bits que no sean Unicode son todas compatibilidad de algún tipo y / o inercia. En ese caso, las razones más frecuentes para usar UTF-8 son la compatibilidad con estándares como XML que exigen o prefieren UTF-8.
Las diferencias en el número de bytes que crees que el texto tomará en diferentes codificaciones, especialmente en el almacenamiento, son en su mayoría teóricas. En situaciones del mundo real, los requisitos de compatibilidad son más importantes. Si se usa compresión, las diferencias de tamaño desaparecen de todos modos. Incluso si no se utiliza la compresión, el tamaño total del texto es difícil de predecir y rara vez es un factor decisivo.
Al convertir código heredado que usaba codificaciones de 8 bits que no son Unicode, usar UTF-16 puede ser una herramienta para asegurarse de que todo el código se haya convertido, ya que las discrepancias se pueden detectar como errores de tipo de tiempo de compilación. Muchos lenguajes, tiempos de ejecución y bibliotecas como Javascript, JVM, .NET, ICU utilizan cadenas de 16 bits y UTF-16, aunque el almacenamiento y los protocolos de Internet suelen ser de 8 bits.
Muchas API requieren otras codificaciones Unicode, principalmente UTF-16. Por ejemplo, Java, .NET, Win32.
Porque ellos no saben mejor La única crítica válida para utf-8 es que las codificaciones para lenguajes asiáticos comunes están sobredimensionadas de otras codificaciones. UTF-8 es superior porque
- Es ASCII compatible. La mayoría de las operaciones de cadenas conocidas y probadas no necesitan adaptación.
- Es Unicode. Cualquier cosa que no sea Unicode ni siquiera debería ser considerada en este día y edad. Si tiene datos importantes para codificar X, dedique dos minutos a Google y escriba una función de conversión. Incluso si tiene que interactuar con la aplicación heredada Z sin fuente, puede ejecutar sus comunicaciones a través de un conducto para que su lógica permanezca en el siglo XXI.
- UTF-16 tampoco es de longitud fija y, suponiendo que sea como muchos lo hacen, solo causará errores terribles.
- Además, Unicode es muy complejo y es casi seguro que cualquier algoritmo de tamaño fijo adaptado de ASCII tendrá malos resultados incluso en UTF-32.
Digamos que tienes esta cadena UTF-16.
[0][1][2][F|3] [4] [5]
Y si desea insertar un carácter con el código 8 entre [3] y [4], insertaría (5,8)
Si no busca caracteres fuera de BMP (en serie como en UTF-8 ya que no puede saber cuántos caracteres de tamaño doble tiene) obtiene:
[0][1][2][F|8][3][4][5]
Dos nuevos personajes basura Tanto para su codificación de tamaño fijo. Por supuesto, puede rechazar estos caracteres por completo, pero cuando el código interactúa con el mundo real, puede encontrar que su programa guarda el perfil de este usuario que vive en rm -Rf / in .profile en lugar de [Classical Chinese Proverb] .profile .
O simplemente un usuario enojado que no puede escribir su tesis sobre Proverbios Chinos Clásicos con su software.
Porque fuera del mundo de habla inglesa, las personas han usado varias codificaciones que preceden a Unicode y que están diseñadas para sus respectivos idiomas durante décadas. Estas codificaciones específicas del lenguaje se han arraigado en todas partes y son prácticamente un estándar. Si desea tener alguna esperanza de interactuar con los sistemas heredados, debe usarlos, por lo que todos los sistemas deben admitirlos y, por lo general, usarlos como predeterminados, incluso si ahora también son compatibles con UTF-8. Incluso puede haber varias codificaciones heredadas utilizadas tradicionalmente para diferentes propósitos.
Ejemplos:
- ISO-8859-1 en Europa occidental: en realidad también obsoleto, ya que necesita ISO-8859-15 para el símbolo del euro
- ISO-2022-JP en Japón para correos electrónicos, Shift JIS para sitios web
- Big5 en Taiwán
- GB2312 en China
Los dos últimos ejemplos muestran que las codificaciones incluso pueden ser un problema político.
También vale la pena recordar que, en algunas circunstancias (donde se necesita un conjunto de caracteres no latinos), UTF-8 en realidad puede hincharse más que la codificación Unicode de 16 bits. En esos casos, ucs-2 o utf-16 serían una mejor opción.
UTF-8 es muy eficiente en la codificación de texto en inglés simple (igual que ASCII). Si su base de usuarios es mayoritariamente, digamos, china, será mucho mejor que use UTF-16.
Para obtener más información, vea El mínimo absoluto. Todo desarrollador de software. Absolutamente, positivamente debe saber sobre Unicode y conjuntos de caracteres .
Una razón legítima es cuando necesita tratar con documentos heredados, software o hardware que no son compatibles con Unicode.
Otra razón legítima es que necesita utilizar un lenguaje de programación / bibliotecas que no son compatibles con UTF8 / Unicode bien ... o en absoluto.
Otras respuestas mencionan que UTF-16 es más compacto que UTF-8 para idiomas / caracteres asiáticos.
Y, por supuesto, hay razones como la miopía, la ignorancia, la pereza ... y los plazos.
Unicode ciertamente es un buen lugar para trabajar en la mayoría de los casos, pero un desarrollador debe estar familiarizado con muchos tipos diferentes de codificación de caracteres. Ciertamente, ASCII podría usarse si el conjunto de caracteres es limitado.
¿Qué sucede si eres desarrollador y recibes datos de una fuente que no envía UTF-8? Podría haber muchos problemas de interfaz si no entiende su entrada.
El artículo de Joel sobre los must-knows para la codificación de caracteres es bueno y vale la pena leerlo.
Wikipedia enumera las ventajas y desventajas de UTF-8 en comparación con una variedad de otras codificaciones:
http://en.wikipedia.org/wiki/UTF-8#Advantages_and_disadvantages
Las desventajas más importantes son en mi humilde opinión que UTF-8 podría usar significativamente más espacio especialmente en idiomas asiáticos como chino, japonés o hindi y que no todos los puntos de código tienen el mismo tamaño, lo que dificulta las mediciones y muchas operaciones de cadena como la búsqueda ineficaces.
http://www.personal.psu.edu/ejp10/blogs/gotunicode/2007/02/cjk-unicode-angst-in-japan-and.html tiene un buen resumen + enlaces sobre la dificultad que tienen los usuarios japoneses con Unicode.
http://www.hastingsresearch.com/net/04-unicode-limitations.shtml
Al parecer, Unicode se está alejando de la unificación debido a tales quejas.
En los puntos de código UTF-8 entre 0800
y FFFF
ocupan tres bytes en UTF-8 pero solo dos en UTF-16. Consulte la comparación de wikipedia para obtener más detalles, pero básicamente si el texto usa mucho puntos de código en este rango (por ejemplo, si es chino), los archivos UTF-8 serán más grandes que los archivos UTF-16 con el mismo contenido.