string - tipos - utf 8 en xml
¿Cuántos bytes toma un carácter Unicode? (10)
Bueno, acabo de abrir 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 utiliza un byte para cualquier carácter ASCII, que tiene los mismos valores de código en codificación UTF-8 y ASCII, y hasta cuatro bytes para otros caracteres), el UCS-2 ahora obsoleto (que utiliza dos bytes para cada carácter pero no puede codificar todos los caracteres en el estándar actual de Unicode) "
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, nuevamente, en esa cita, una de ellas incluso tiene 1 byte por carácter, al igual que a lo que estás acostumbrado.
Así que tu respuesta simple que quieres es que varía.
Estoy un poco confundido acerca de las codificaciones. Que yo sepa, los caracteres ASCII antiguos tomaron 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 cierto? 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í. Estoy deseando ver una respuesta simple.
Echa un vistazo a este convertidor de código Unicode . Por ejemplo, ingrese 0x2009
, donde 2009 es el número Unicode para espacio fino , en el campo "0x ... notación", y haga clic en Convertir. El número hexadecimal E2 80 89
(3 bytes) aparece en el campo "Unidades de código UTF-8".
En UTF-8:
1 byte: 0 - 7F (ASCII)
2 bytes: 80 - 7FF (all European plus some Middle Eastern)
3 bytes: 800 - FFFF (multilingual plane incl. the top 1792 and private-use)
4 bytes: 10000 - 10FFFF
En UTF-16:
2 bytes: 0 - D7FF (multilingual plane except the top 1792 and private-use )
4 bytes: D800 - 10FFFF
En UTF-32:
4 bytes: 0 - 10FFFF
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.
En Unicode la respuesta no es fácil. El problema, como ya has señalado, 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 por dos.
La única codificación donde (a partir de ahora) podemos hacer la declaración sobre el tamaño es UTF-32. Allí 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:
- caracteres compuestos, donde en lugar de utilizar la entidad de carácter que ya está acentuada / diacrítica (À), un usuario decidió combinar el acento y el carácter base (`A).
- puntos de código. Los puntos de código son el método por el cual las codificaciones UTF permiten codificar más que la cantidad de bits que normalmente les permite su nombre. Por ejemplo, UTF-8 designa ciertos bytes que, por sí solos, no son válidos, pero cuando son seguidos por un byte de continuación válido, permitirán describir un carácter más allá del rango de 8.2 de 0..255. Vea los Examples y las codificaciones extensas a continuación en el artículo de Wikipedia sobre UTF-8.
- El excelente ejemplo dado es que el carácter € (el punto de código
U+20AC
puede representarse como secuencia de tres bytesE2 82 AC
o secuencia de cuatro bytesF0 82 82 AC
. - Ambos son válidos, y esto muestra cuán complicada es la respuesta cuando se habla de "Unicode" y no de una codificación específica de Unicode, como UTF-8 o UTF-16.
- El excelente ejemplo dado es que el carácter € (el punto de código
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
No verás una respuesta simple porque no hay una.
Primero, Unicode no contiene "todos los caracteres de todos los idiomas", 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 a un carácter. Digo por lo general porque hay conceptos como la combinación de caracteres. Puede estar familiarizado con cosas como acentos o diéresis. Se pueden usar con otro carácter, como a
o u
para crear un nuevo carácter lógico. Por lo tanto, un carácter puede constar de 1 o más puntos de código.
Para ser útiles en sistemas de computación necesitamos elegir una representación para esta información. Esas son las diversas codificaciones de 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 que es de 32 bits, lo que significa que un punto de código individual encaja cómodamente en 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 en particular no puede representarse en absoluto 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"
que son 2 puntos de código, uno de los cuales es una combinación de caracteres o "accented ''a''"
que es un punto de código ).
Para UTF-16, el carácter necesita cuatro bytes (dos unidades de código) si comienza con 0xD800 o mayor; tal carácter se llama un "par suplente". Más específicamente, un par suplente tiene la forma:
[0xD800 - 0xDBFF] [0xDC00 - 0xDFF]
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álido (excepto los marcadores de la lista de materiales, podría decirse).
Consulte http://unicodebook.readthedocs.io/unicode_encodings.html , sección 7.5.
Por extraño que parezca, nadie señaló cómo calcular cuántos bytes está tomando un char de Unicode. Aquí está la regla para las cadenas codificadas en UTF-8:
Binary Hex Comments
0xxxxxxx 0x00..0x7F Only byte of a 1-byte character encoding
10xxxxxx 0x80..0xBF Continuation bytes (1-3 continuation bytes)
110xxxxx 0xC0..0xDF First byte of a 2-byte character encoding
1110xxxx 0xE0..0xEF First byte of a 3-byte character encoding
11110xxx 0xF0..0xF4 First byte of a 4-byte character encoding
Entonces, la respuesta rápida es: toma de 1 a 4 bytes, dependiendo de la primera, que indicará cuántos bytes ocupará.
Actualizar
Como señaló prewett , esta regla solo se aplica a UTF-8
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).
Que yo sepa, los caracteres ASCII antiguos tomaron un byte por carácter.
Derecha. 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 algún sentido).
¿Cuántos bytes requiere un carácter Unicode?
Unicode simplemente 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.
Supongo que un carácter Unicode puede contener todos los caracteres posibles de cualquier idioma, ¿estoy en lo cierto?
No. Pero casi. Así que básicamente sí. Pero todavía no.
Entonces, ¿cuántos bytes necesita por carácter?
Igual que tu segunda pregunta.
¿Y qué significan UTF-7, UTF-6, UTF-16, etc.? ¿Son algunas versiones tipo Unicode?
No, esas son las codificaciones. Definen cómo los bytes / octetos deben representar los caracteres Unicode.
Un par de ejemplos. Si algunos de ellos no pueden mostrarse en su navegador (probablemente porque la fuente no los admite), vaya a http://codepoints.net/U+1F6AA
(reemplace 1F6AA
con el punto de código en hex) para ver una imagen.
- U + 0061 LETRA PEQUEÑA LATINA A:
a
- Nº: 97
- UTF-8: 61
- UTF-16: 00 61
- U + 0061 LETRA PEQUEÑA LATINA A:
- U + 00A9 SIGNO DE DERECHO DE AUTOR:
©
- Nº: 169
- UTF-8: C2 A9
- UTF-16: 00 A9
- U + 00AE FIRMA REGISTRADA:
®
- Nº: 174
- UTF-8: C2 AE
- UTF-16: 00 AE
- U + 00A9 SIGNO DE DERECHO DE AUTOR:
- U + 1337 PHWA SÍLABLE ETIÓPICO:
ጷ
- Nº: 4919
- UTF-8: E1 8C B7
- UTF-16: 13 37
- U + 2014 EM DASH:
—
- Nº: 8212
- UTF-8: E2 80 94
- UTF-16: 20 14
- U + 2030 POR MUESTRA MILLA:
‰
- Nº: 8240
- UTF-8: E2 80 B0
- UTF-16: 20 30
- SIGNO EURO U + 20AC:
€
- Nº: 8364
- UTF-8: E2 82 AC
- UTF-16: 20 AC
- U + 2122 SIGNO DE MARCA:
™
- Nº: 8482
- UTF-8: E2 84 A2
- UTF-16: 21 22
- U + 2603 MUÑECO DE NIEVE:
☃
- Nº: 9731
- UTF-8: E2 98 83
- UTF-16: 26 03
- U + 260E TELÉFONO NEGRO:
☎
- Nº: 9742
- UTF-8: E2 98 8E
- UTF-16: 26 0E
- U + 2614 PARAGUAS CON GOTAS DE LLUVIA:
☔
- Nº: 9748
- UTF-8: E2 98 94
- UTF-16: 26 14
- U + 263A CARA SONRIENTE BLANCA:
☺
- Nº: 9786
- UTF-8: E2 98 BA
- UTF-16: 26 3A
- U + 2691 BANDERA NEGRA:
⚑
- Nº: 9873
- UTF-8: E2 9A 91
- UTF-16: 26 91
- U + 269B SÍMBOLO
⚛
:⚛
- Nº: 9883
- UTF-8: E2 9A 9B
- UTF-16: 26 9B
- U + 2708 AVION:
- Nº: 9992
- UTF-8: E2 9C 88
- UTF-16: 27 08
- U + 271E CRUZ DE LATINA BLANCA SOMBRADA:
✞
- Nº: 10014
- UTF-8: E2 9C 9E
- UTF-16: 27 1E
- U + 3020 POSTAL MARK CARA:
〠
- Nº: 12320
- UTF-8: E3 80 A0
- UTF-16: 30 20
- U + 8089 CJK IDEOGRAPH UNIFICADO-8089:
肉
- Nº: 32905
- UTF-8: E8 82 89
- UTF-16: 80 89
- U + 1337 PHWA SÍLABLE ETIÓPICO:
- U + 1F4A9 PILA DE POO:
💩
- Nº: 128169
- UTF-8: F0 9F 92 A9
- UTF-16: D8 3D DC A9
- U + 1F680 ROCKET:
🚀
- Nº: 128640
- UTF-8: F0 9F 9A 80
- UTF-16: D8 3D DE 80
- U + 1F4A9 PILA DE POO:
Está bien, me estoy dejando llevar ...
Hechos graciosos:
- Si está buscando un carácter específico, puede copiarlo y pegarlo en http://codepoints.net/ .
- Perdí mucho tiempo en esta lista inútil (¡pero está solucionada!).
- MySQL tiene un conjunto de caracteres llamado "utf8" que en realidad no admite caracteres de más de 3 bytes. Así que no puedes insertar una pila de caca , el campo se truncará silenciosamente. Utilice "utf8mb4" en su lugar.
- Hay una página de prueba de muñeco de nieve (unicodesnowmanforyou.com) .
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 una 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 carácter tiene 4 bytes por carácter.
UTF-16
usa 16 bits para cada carácter y representa solo una parte de los caracteres Unicode llamados BMP (para todos los propósitos prácticos es suficiente). Java utiliza esta codificación en sus cadenas.