utf8 tipos for error string language-agnostic unicode encoding

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.



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:

  1. 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).
  2. 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 bytes E2 82 AC o secuencia de cuatro bytes F0 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.


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 + 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 + 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 + 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

Está bien, me estoy dejando llevar ...

Hechos graciosos:


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.