Estoy un poco confundido acerca de las codificaciones. Hasta donde yo sé, los caracteres ASCII antiguos tomaban un byte por carácter. ¿Cuántos bytes requiere un carácter Unicode?
Supongo que un carácter Unicode puede contener todos los caracteres posibles de cualquier idioma. ¿Estoy en lo correcto? Entonces, ¿cuántos bytes necesita por carácter?
¿Y qué significan UTF-7, UTF-6, UTF-16, etc.? ¿Son diferentes versiones de Unicode?
Leí el artículo de Wikipedia sobre Unicode pero es bastante difícil para mí. Tengo muchas ganas de ver una respuesta simple.
Respuestas:
No verá una respuesta simple porque no hay una.
Primero, Unicode no contiene "todos los caracteres de cada idioma", aunque sí lo intenta.
Unicode en sí es un mapeo, define puntos de código y un punto de código es un número, asociado generalmente con un carácter. Digo generalmente porque hay conceptos como combinar personajes. Puede estar familiarizado con cosas como acentos o diéresis. Esos se pueden usar con otro personaje, como un
a
o au
para crear un nuevo personaje lógico. Por lo tanto, un personaje puede constar de 1 o más puntos de código.Para ser útiles en los sistemas informáticos, debemos elegir una representación para esta información. Esas son las diversas codificaciones Unicode, como utf-8, utf-16le, utf-32, etc. Se distinguen en gran medida por el tamaño de sus unidades de código. UTF-32 es la codificación más simple, tiene una unidad de código de 32 bits, lo que significa que un punto de código individual se adapta cómodamente a una unidad de código. Las otras codificaciones tendrán situaciones en las que un punto de código necesitará múltiples unidades de código, o ese punto de código particular no se puede representar en la codificación (esto es un problema, por ejemplo, con UCS-2).
Debido a la flexibilidad de combinar caracteres, incluso dentro de una codificación dada, el número de bytes por carácter puede variar según el carácter y la forma de normalización. Este es un protocolo para tratar con caracteres que tienen más de una representación (puede decir
"an 'a' with an accent"
cuál es 2 puntos de código, uno de los cuales es un carácter de combinación o"accented 'a'"
cuál es un punto de código).fuente
Por extraño que parezca, nadie señaló cómo calcular cuántos bytes está tomando un carácter Unicode. Aquí está la regla para las cadenas codificadas UTF-8:
Entonces, la respuesta rápida es: toma de 1 a 4 bytes, dependiendo del primero, que indicará cuántos bytes ocupará.
fuente
Sé que esta pregunta es antigua y ya tiene una respuesta aceptada, pero quiero ofrecer algunos ejemplos (con la esperanza de que sea útil para alguien).
Correcto. En realidad, dado que ASCII es una codificación de 7 bits, admite 128 códigos (95 de los cuales son imprimibles), por lo que solo usa medio byte (si eso tiene sentido).
Unicode solo asigna caracteres a puntos de código. No define cómo codificarlos. Un archivo de texto no contiene caracteres Unicode, sino bytes / octetos que pueden representar caracteres Unicode.
No. Pero casi. Entonces básicamente sí. Pero aun así no.
Igual que su segunda pregunta.
No, esas son codificaciones. Definen cómo los bytes / octetos deben representar caracteres Unicode.
Un par de ejemplos Si algunos de ellos no se pueden mostrar en su navegador (probablemente porque la fuente no los admite), vaya a
http://codepoints.net/U+1F6AA
(reemplazar1F6AA
con el punto de código en hexadecimal) para ver una imagen.a
©
®
ጷ
—
‰
€
™
☃
☎
☔
☺
⚑
⚛
✈
✞
〠
肉
💩
🚀
Ok, me estoy dejando llevar ...
Hechos graciosos:
fuente
00A9
lugar de00 A9
(que sería UTF-16BE).Simplemente hablando
Unicode
es un estándar que asigna un número (llamado punto de código) a todos los personajes del mundo (todavía está en progreso).Ahora necesita representar estos puntos de código usando bytes, eso se llama
character encoding
.UTF-8, UTF-16, UTF-6
son formas de representar a esos personajes.UTF-8
es codificación de caracteres multibyte. Los caracteres pueden tener de 1 a 6 bytes (algunos de ellos pueden no ser necesarios en este momento).UTF-32
cada caracter tiene 4 bytes por caracter.UTF-16
usa 16 bits para cada carácter y representa solo una parte de los caracteres Unicode llamados BMP (para todos los fines prácticos es suficiente). Java usa esta codificación en sus cadenas.fuente
En UTF-8:
En UTF-16:
En UTF-32:
10FFFF es el último punto de código Unicode por definición, y se define de esa manera porque es el límite técnico de UTF-16.
También es el punto de código más grande que UTF-8 puede codificar en 4 bytes, pero la idea detrás de la codificación de UTF-8 también funciona para codificaciones de 5 y 6 bytes para cubrir puntos de código hasta 7FFFFFFF, es decir. la mitad de lo que puede UTF-32.
fuente
En Unicode, la respuesta no se da fácilmente. El problema, como ya señaló, son las codificaciones.
Dada cualquier oración en inglés sin caracteres diacríticos, la respuesta para UTF-8 sería tantos bytes como caracteres y para UTF-16 sería el número de caracteres multiplicado por dos.
La única codificación donde (a partir de ahora) podemos hacer la declaración sobre el tamaño es UTF-32. Siempre hay 32 bits por carácter, aunque imagino que los puntos de código están preparados para un futuro UTF-64 :)
Lo que lo hace tan difícil son al menos dos cosas:
U+20AC
se puede representar ya sea como de tres bytes de secuenciaE2 82 AC
o cuatro bytes de secuenciaF0 82 82 AC
.fuente
Hay una gran herramienta para calcular los bytes de cualquier cadena en UTF-8: http://mothereff.in/byte-counter
Actualización: @mathias ha hecho público el código: https://github.com/mathiasbynens/mothereff.in/blob/master/byte-counter/eff.js
fuente
Bueno, también abrí la página de Wikipedia, y en la parte de introducción vi "Unicode puede implementarse mediante diferentes codificaciones de caracteres. Las codificaciones más utilizadas son UTF-8 (que usa un byte para cualquier carácter ASCII, que tiene los mismos valores de código en la codificación UTF-8 y ASCII, y hasta cuatro bytes para otros caracteres), el UCS-2 ahora obsoleto (que usa dos bytes para cada carácter pero no puede codificar cada carácter en el estándar Unicode actual) "
Como lo demuestra esta cita, su problema es que está asumiendo que Unicode es una forma única de codificar caracteres. En realidad, hay varias formas de Unicode, y, de nuevo en esa cita, una de ellas incluso tiene 1 byte por carácter, al igual que a lo que estás acostumbrado.
Entonces, su respuesta simple que desea es que varía.
fuente
Para UTF-16, el carácter necesita cuatro bytes (dos unidades de código) si comienza con 0xD800 o superior; dicho personaje se llama "par sustituto". Más específicamente, un par sustituto tiene la forma:
donde [...] indica una unidad de código de dos bytes con el rango dado. Cualquier cosa <= 0xD7FF es una unidad de código (dos bytes). Cualquier cosa> = 0xE000 no es válida (excepto los marcadores de lista de materiales, posiblemente).
Consulte http://unicodebook.readthedocs.io/unicode_encodings.html , sección 7.5.
fuente
Echa un vistazo a este convertidor de código Unicode . Por ejemplo, ingrese
0x2009
, donde 2009 es el número Unicode para espacio reducido , en el campo "0x ... notación", y haga clic en Convertir. El número hexadecimalE2 80 89
(3 bytes) aparece en el campo "Unidades de código UTF-8".fuente
De Wiki:
Estas son las tres codificaciones diferentes más populares.
fuente
Unicode
es un estándar que proporciona un número único para cada personaje. Estos números únicos se denominancode point
s (que es solo un código único) a todos los caracteres existentes en el mundo (algunos todavía no se han agregado).Para diferentes propósitos, es posible que deba representar esto
code points
en bytes (la mayoría de los lenguajes de programación lo hacen), y aquí es dondeCharacter Encoding
entra en juego.UTF-8
,UTF-16
,UTF-32
Y así sucesivamente son todosCharacter Encodings
, y los puntos de código de Unicode están representados en estas codificaciones, de diferentes maneras.UTF-8
la codificación tiene una longitud de ancho variable y los caracteres codificados pueden ocupar de 1 a 4 bytes inclusive;UTF-16
tiene una longitud variable y los caracteres, codificados, pueden tomar 1 o 2 bytes (que son 8 o 16 bits). Esto representa solo una parte de todos los caracteres Unicode llamados BMP (plano multilingüe básico) y es suficiente para casi todos los casos. Java usaUTF-16
codificación para sus cadenas y caracteres;UTF-32
tiene una longitud fija y cada carácter ocupa exactamente 4 bytes (32 bits).fuente