¿Cuál es el número máximo de bytes para un solo carácter codificado en UTF-8?
Encriptaré los bytes de una cadena codificada en UTF-8 y, por lo tanto, necesito poder calcular el número máximo de bytes para una cadena codificada en UTF-8.
¿Podría alguien confirmar el número máximo de bytes para un solo carácter codificado en UTF-8?
Respuestas:
El número máximo de bytes por carácter es 4 según RFC3629 que limita la tabla de caracteres a
U+10FFFF
:(La especificación original permitía códigos de caracteres de hasta seis bytes para los puntos de código anteriores
U+10FFFF
).Los caracteres con un código de menos de 128 requerirán solo 1 byte, y los siguientes códigos de 1920 caracteres solo requerirán 2 bytes. A menos que esté trabajando con un lenguaje esotérico, multiplicar el número de caracteres por 4 será una sobreestimación significativa.
fuente
11111111
y tener un2^(6*7)
poco de espacio para los caracteres?Sin más contexto, diría que el número máximo de bytes para un carácter en UTF-8 es
respuesta: 6 bytes
El autor de la respuesta aceptada señaló correctamente esto como la "especificación original". Eso era válido a través de RFC-2279 1 . Como J. Cocoe señaló en los comentarios a continuación, esto cambió en 2003 con RFC-3629 2 , que limita UTF-8 a la codificación de 21 bits, que se puede manejar con el esquema de codificación usando cuatro bytes.
respuesta si cubre todo unicode: 4 bytes
Pero, en Java <= v7 , ¿hablan de un máximo de 3 bytes para representar unicode con UTF-8? Esto se debe a que la especificación Unicode original solo definía el plano multilingüe básico ( BMP ), es decir, es una versión anterior de Unicode o un subconjunto de Unicode moderno. Entonces
respuesta si representa solo unicode original, el BMP: 3 bytes
Pero, el OP habla de ir al revés. No de caracteres a bytes UTF-8, sino de bytes UTF-8 a una representación de "Cadena" de bytes. Quizás el autor de la respuesta aceptada obtuvo eso del contexto de la pregunta, pero esto no es necesariamente obvio, por lo que puede confundir al lector casual de esta pregunta.
Pasando de UTF-8 a la codificación nativa, tenemos que ver cómo se implementa la "Cadena". Algunos lenguajes, como Python> = 3, representarán cada carácter con puntos de código enteros, lo que permite 4 bytes por carácter = 32 bits para cubrir los 21 que necesitamos para Unicode, con algo de desperdicio. ¿Por qué no exactamente 21 bits? Porque las cosas son más rápidas cuando están alineadas por bytes. Algunos lenguajes como Python <= 2 y Java representan caracteres que utilizan una codificación UTF-16, lo que significa que tienen que utilizar pares sustitutos para representar unicode extendido (no BMP). De cualquier manera, sigue siendo un máximo de 4 bytes.
respuesta si va UTF-8 -> codificación nativa: 4 bytes
Entonces, conclusión final, 4 es la respuesta correcta más común, así que lo hicimos bien. Pero el kilometraje puede variar.
fuente
1F FF FF
21 bits. El número 0x110000 corresponde a los 17 planos de puntos de código 0x10000 cada uno.El número máximo de bytes para admitir US-ASCII, una codificación del alfabeto inglés estándar, es 1. Pero limitar el texto al inglés se está volviendo menos deseable o práctico a medida que pasa el tiempo.
Unicode fue diseñado para representar los glifos de todos los lenguajes humanos, así como muchos tipos de símbolos, con una variedad de características de representación. UTF-8 es una codificación eficiente para Unicode, aunque todavía sesgada hacia el inglés. UTF-8 se sincroniza automáticamente: los límites de los caracteres se identifican fácilmente mediante la exploración de patrones de bits bien definidos en cualquier dirección.
Si bien el número máximo de bytes por carácter UTF-8 es 3 para admitir solo el espacio de direcciones de 2 bytes del plano 0, el plano multilingüe básico (BMP), que puede aceptarse como soporte mínimo en algunas aplicaciones, es 4 para admitir los 17 planos actuales de Unicode (a partir de 2019). Cabe señalar que es probable que muchos caracteres "emoji" populares se encuentren en el plano 16, que requiere 4 bytes.
Sin embargo, esto es solo para glifos de caracteres básicos. También hay varios modificadores, como hacer que aparezcan acentos sobre el carácter anterior, y también es posible unir un número arbitrario de puntos de código para construir un "grafema" complejo. En la programación del mundo real, por lo tanto, el uso o la suposición de un número máximo fijo de bytes por carácter probablemente resultará en un problema para su aplicación.
Estas consideraciones implican que las cadenas de caracteres UTF-8 no deben "expandirse" en matrices de longitud fija antes del procesamiento, como se ha hecho a veces. En cambio, la programación debe realizarse directamente, utilizando funciones de cadena diseñadas específicamente para UTF-8.
fuente