unicode - que - qué es un archivo utf 8
en todo momento, el texto codificado en UTF-8 nunca nos dará más de un tamaño de archivo de+50% del mismo texto codificado en UTF-16. ¿verdadero Falso? (4)
En UTF-8, cada punto de código de 0-127 se almacena en un solo byte . Solo los puntos de código 128 y superiores se almacenan usando 2, 3, de hecho, hasta 6 bytes.
Aunque los caracteres UTF-8 pueden usar hasta 4 bytes (y más es teóricamente posible), no se usa para el plano multilingüe básico que incluye "casi todos los idiomas modernos".
Se necesitan tres bytes para el resto del plano multilingüe básico (que contiene prácticamente todos los caracteres de uso común). Se necesitan cuatro bytes para los caracteres en los otros planos de Unicode, que incluyen caracteres CJK menos comunes y varios scripts históricos.
Así que supongo que un 100% de sobrecarga, aunque teóricamente posible, no es posible con un lenguaje moderno típico. Tendría que usar algo exótico del plano multilingüe suplementario, que usa 4 bytes en UTF-8, para lograr esto.
Para documentos HTML o texto mixto, puede que no sea necesario cambiar a UTF-16 para ahorrar espacio:
Los caracteres U + 0800 a U + FFFF usan tres bytes en UTF-8, pero solo dos en UTF-16. Como resultado, el texto en (por ejemplo) chino, japonés o hindi podría tener más espacio en UTF-8 si hay más de estos caracteres que caracteres ASCII. Esto sucede para texto puro, pero rara vez para documentos HTML. Por ejemplo, tanto los artículos japoneses UTF-8 como Hindi Unicode en Wikipedia tienen más espacio si se guardan como UTF-16 que la versión original UTF-8.
Vea la comparación de UTF-8 a UTF-16 en Wikipedia .
Joel Spolsky escribió un excelente artículo sobre Unicode, realmente lo puedo recomendar:
En algún lugar que leo (reformulado):
Si comparamos un archivo codificado en UTF-8 VS un archivo codificado en UTF-16, en algunas ocasiones, el archivo UTF-8 puede dar un tamaño de archivo de 50% a 100% más grande
¿Tengo razón al decir que el artículo es incorrecto porque, en todo momento , el texto codificado en UTF-8 nunca nos dará más de un tamaño de archivo de + 50% del mismo texto codificado en UTF-16?
Si tiene un byte para el personaje y agrega un segundo byte, lo llamaría un aumento del 100%, no del 50%. Creo que eso es lo que el autor quiere decir.
Si escribo X
caracteres con N
bytes / caracteres en un archivo, tendré NX
bytes en ese archivo. De modo que puede ver dónde duplicar o triplicar el número de bytes por carácter tendrá un efecto lineal en el tamaño del archivo.
Sí, estás en lo correcto. Los puntos de código en el rango U + 0800..U + FFFF dan un tamaño de + 50%.
UTF-8 UTF-16
U+0000..U+007F 1 2
U+0080..U+07FF 2 2
U+0800..U+FFFF 3 2
U+010000..U+10FFFF 4 4
La respuesta es que en UTF-8, ASCII tiene solo 1 byte, pero que, en general, la mayoría de los idiomas occidentales, incluido el inglés, usan algunos caracteres aquí y allá que requieren 2 bytes, por lo que los porcentajes reales varían. Todos los idiomas griegos y cirílicos requieren al menos 2 bytes por carácter en su secuencia de comandos cuando están codificados en UTF-8.
Los idiomas orientales comunes requieren para sus caracteres 3 bytes en UTF-8 pero 2 en UTF-16. Sin embargo, tenga en cuenta que los caracteres orientales "poco comunes" requieren 4 bytes tanto en UTF-8 como en UTF-16.
3 es de hecho solo un 50% mayor que 2. Pero eso es solo para un solo punto de código. No se aplica a un archivo completo.
El porcentaje real es imposible de especificar con precisión, porque no se sabe si el saldo del código apunta hacia abajo en el rango UTF-8 de 1 o 2 bytes, o en el rango UTF-8 de 4 bytes. Si hay espacio en blanco en el texto asiático, entonces eso es solo un byte de UTF-8, y sin embargo es un costoso 2 bytes de UTF-16.
Estas cosas sí varían. Solo puede obtener números precisos en texto preciso, no en texto general. Los puntos de código en texto asiático toman 1, 2, 3 o 4 bytes de UTF-8, mientras que en UTF-16 requieren de 2 a 4 bytes cada uno.
Caso de estudio
Compara las páginas de Wikipedia de varios idiomas en Tokio para ver a qué me refiero. Incluso en los idiomas orientales, todavía hay un montón de ASCII pasando. Esto solo hace que tus figuras fluctúen. Considerar:
Paras Lines Words Graphs Chars UTF16 UTF8 8:16 16:8 Language
519 1525 6300 43120 43147 86296 44023 51% 196% English
343 728 1202 8623 8650 17302 9173 53% 189% Welsh
541 1722 9013 57377 57404 114810 59345 52% 193% Spanish
529 1712 9690 63871 63898 127798 67016 52% 191% French
321 837 2442 18999 19026 38054 21148 56% 180% Hungarian
202 464 976 7140 7167 14336 11848 83% 121% Greek
348 937 2938 21439 21467 42936 36585 85% 117% Russian
355 788 613 6439 6466 12934 13754 106% 94% Chinese, simplified
209 419 243 2163 2190 4382 3331 76% 132% Chinese, traditional
461 1127 1030 25341 25368 50738 65636 129% 77% Japanese
410 925 2955 13942 13969 27940 29561 106% 95% Korean
Cada una de ellas es la página de Tokio Wikipedia guardada como texto, no como HTML. Todo el texto está en NFC, no en NFD. El significado de cada una de las columnas es el siguiente:
- Paras es el número de espacios de texto separados en blanco.
- Líneas es el número de tramos de texto separados por salto de línea.
- Palabras es la cantidad de espacios de texto separados por espacios en blanco.
- Gráficos es el número de clústeres de grafemas extendidos Unicode, a veces llamados glifos. Estos son personajes visibles para el usuario.
- Chars es la cantidad de puntos de código Unicode. Estos son, o deberían ser, caracteres visibles por el programador.
- UTF16 es cuántos bytes ocupan cuando el archivo se almacena como UTF-16.
- UTF8 es la cantidad de bytes que ocupa cuando el archivo se almacena como UTF-8.
- 8:16 es la relación entre el tamaño de UTF-8 y el tamaño de UTF-16, expresado como un porcentaje.
- 16: 8 es la relación entre el tamaño de UTF-16 y el tamaño de UTF-8, expresado como un porcentaje.
- El idioma es la versión de la página de Tokio de la que estamos hablando aquí.
Agrupé los idiomas en latín occidental, occidental no latín y oriental. Observaciones:
Los idiomas occidentales que usan la escritura latina sufren terriblemente al pasar de UTF-8 a UTF-16, siendo el inglés el que más sufre al expandirse en un 96% y el húngaro en menor medida al expandirse en un 80%. Todos son enormes
Los idiomas occidentales que no usan la escritura latina todavía sufren, pero solo 15-20%.
¡Los idiomas orientales NO SUFREN en UTF-8 de la manera en que todos dicen que lo hacen! Mirad:
- En coreano y en chino (simplificado), solo obtiene un 6% más en UTF-8 que en UTF-16.
- En japonés, obtienes solo un 29% más en UTF-8 que en UTF-16.
- ¡Los chinos tradicionales en realidad se hicieron más pequeños en UTF-8 que en UTF-16! De hecho, cuesta 32% usar UTF-16 sobre UTF-8 para esta muestra. Si mira las columnas Líneas y palabras, parece que esto podría deberse al uso de espacio en blanco.
Espero haber respondido a su pregunta. Simplemente no hay aumento de tamaño de + 50% a + 100% para los idiomas orientales cuando se codifica en UTF-8 en comparación con cuando estos mismos textos están codificados en UTF-16. Solo cuando se toman puntos de código individuales, ¿alguna vez ves números como ese, que es una métrica completamente irrazonable?