Cuántos bytes que hace uno de los caracteres Unicode tomar?

Estoy un poco confundido acerca de codificaciones. Por lo que yo sé de edad caracteres ASCII tomó un byte por carácter. Cuantos bytes se hace un carácter Unicode requieren?

Supongo que uno de los caracteres Unicode puede contener todos los posibles caracteres de cualquier idioma – ¿estoy en lo cierto? Así que, ¿cuántos bytes qué necesita cada personaje?

Y qué UTF-7, UTF-6, UTF-16, etc. significa esto? Son diferentes versiones de Unicode?

He leído el Artículo de Wikipedia acerca de Unicode pero es muy difícil para mí. Estoy deseando ver una respuesta simple.

  • en.wikipedia.org/wiki/Comparison_of_Unicode_encodings
  • Lo sentimos, no hay una respuesta sencilla. Me parece todo un lío. Unicode fue anunciado como el uso de dos bytes y ser capaz de representar todos los caracteres, pero resulta que dos bytes no era suficiente.
  • «Respuesta Simple»: Un carácter unicode toma de 1 a 4 bytes. Unicode cubre una gran cantidad de idiomas, pero no todos. La última vez que me veía, por ejemplo Klingon no era un oficial del conjunto de caracteres Unicode.
  • Klingon no es parte del estándar Unicode en sí, no. Utiliza Uniode del Área de Uso Privado (U+F8D0 – U+F8FF) en su lugar.
  • Salvador pregunta – gracias. Mi situación es que el almacenamiento de datos a través de Lms compatible con SCORM 1.2… el estándar SCORM 1.2 ‘cmi.suspend_data’ es de 4096 bytes de datos que un desarrollador anterior supone significaba que podía almacenar 4096 caracteres. Oh hombre, él estaba equivocado – sólo he descubierto por qué nuestros marcadores falla en cursos de larga duración. Así que ahora sé que desde que estamos usando UTF-8 se ocupa 4 bytes por carácter darnos 1024 caracteres.
  • Un montón de personajes de los lenguajes humanos no están incluidos en Unicode.
  • Por ejemplo?

InformationsquelleAutor nan | 2011-03-13

10 Kommentare

  1. 132

    No ver una respuesta simple porque no hay uno.

    Primero, Unicode no contiene «todos los caracteres de todos los idiomas», aunque de seguro se trate.

    Unicode en sí es una asignación, se define puntos de codificación y un punto de código es un número asociado con generalmente un personaje. Digo generalmente porque hay conceptos como la combinación de caracteres. Usted puede estar familiarizado con cosas como acentos o diéresis. Estos pueden ser utilizados con otro carácter, como un a o un u para crear una nueva lógica de caracteres. Un personaje que por lo tanto puede constar de 1 o más puntos de codificación.

    Ser útil en sistemas de computación que tenemos que elegir una representación de esta información. Esas son las diversas codificaciones unicode, como utf-8, utf-16le, utf-32 etc. Se distinguen principalmente por el tamaño de sus codeunits. UTF-32 es el más simple de codificación, tiene una codeunit que es de 32bits, lo que significa que un individuo de punto de código se adapta cómodamente en una codeunit. Las otras codificaciones habrá situaciones en las que un punto de código se necesitan múltiples codeunits, o que el particular punto de código no puede ser representado en la codificación (este es un problema por ejemplo con UCS-2).

    Debido a la flexibilidad de la combinación de caracteres, incluso dentro de una determinada codificación del número de bytes por carácter puede variar dependiendo del carácter y de la normalización y forma. Este es un protocolo para tratar con personajes que tienen más de una representación (que se puede decir "an 'a' with an accent" que está a 2 puntos de codificación, uno de los cuales es una combinación de char o "accented 'a'" que es un punto de código).

    • OK. Entonces, ¿cuántos bytes toma un personaje representado en un determinado punto de código ? Por ejemplo, el espacio de no separación.
    • fileformat.info/info/unicode/char/a0/index.htm
    • La combinación de caracteres que hacen que la vida de un programador en un infierno cuando se trata de escribir la función strlen(), substr() y otras funciones de manipulación de cadena en UTF8 matrices. Este tipo de trabajo será nunca completa y siempre buggy.
    • Escribí un demo que muestra Windows-1252, UTF8 y UTF8-BOM archivos codificados interpretarse con cada uno de codificación, y compara la igualdad entre los resultados: github.com/vladyrn/encodings_demo
  2. 176

    Extrañamente, nadie señaló cómo calcular cuántos bytes es tomar uno de Unicode char. Esta es la regla para la codificación UTF-8 cadenas:

    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
    

    Así que la respuesta rápida es: de 1 a 4 bytes, dependiendo de la primera que indica cuántos bytes que va a tomar.

    Actualización

    Como prewett señaló, esta regla sólo se aplica a UTF-8

    • Creo que el máximo valor Hexadecimal de 4 caracteres de byte es 0xF7 (no 0xF4).
    • Muchas gracias! Yo era sólo control+f ing a través del estándar de la IETF, y no he encontrado nada acerca de la codificación, y el artículo que estaba leyendo no entrar en detalle suficiente para saber cuántos bits se utilizan para representar el número de trailing código de puntos por cada «personaje».
    • Esto es ahora en la segunda página de mi «introducción para los nuevos miembros del equipo de la» hoja de trucos, junto con la hilarante dos primeros comentarios
  3. 36

    Sé que esta pregunta es viejo y ya ha aceptado la respuesta, pero quiero ofrecer un par de ejemplos (con la esperanza de que va a ser útil para alguien).

    Cuanto sé de edad caracteres ASCII tomó un byte por carácter.

    Derecho. En realidad, desde el ASCII es una codificación de 7 bits, soporta códigos de 128 (95 de los cuales son imprimibles), por lo que solo usa la mitad de un byte (si eso tiene algún sentido).

    Cuantos bytes se hace un carácter Unicode requieren?

    Unicode solo los mapas de caracteres a puntos de codificación. No define cómo se codifican. Un archivo de texto no contiene caracteres Unicode, pero bytes/octetos que pueden representar los caracteres Unicode.

    Supongo que uno de los caracteres Unicode puede contener todos los posibles
    de caracteres de cualquier idioma – ¿estoy en lo cierto?

    No. Pero casi. Así que, básicamente, sí. Pero todavía no.

    Así que, ¿cuántos bytes es necesario por el carácter?

    Mismo que tu 2ª pregunta.

    Y qué UTF-7, UTF-6, UTF-16, etc significa? Son algún tipo de Unicode
    versiones?

    No, esas son las codificaciones. Definen cómo bytes/octetos deben representar los caracteres Unicode.

    Un par de ejemplos. Si algunas de ellas no se puede mostrar en el navegador (probablemente porque la fuente no es compatible), ir a http://codepoints.net/U+1F6AA (reemplazar 1F6AA con el punto de código en hexadecimal) para ver una imagen.

      • U+0061 LETRA A MINÚSCULA LATINA: a
        • Nº: 97
        • UTF-8: 61
        • UTF-16: 00 61
      • U+00A9 SIGNO DE COPYRIGHT: ©
        • Nº: 169
        • UTF-8: C2 A9
        • UTF-16: 00 A9
      • U+00AE SIGNO REGISTRADO: ®
        • Nº: 174
        • UTF-8: C2 AE
        • UTF-16: 00 AE
      • U+1337 ETÍOPE SÍLABA PHWA:
        • Nº: 4919
        • UTF-8: E1 8C B7
        • UTF-16: 13 37
      • U+2014 GUIÓN:
        • Nº: 8212
        • UTF-8: E2 80 94
        • UTF-16: 20 14
      • U+2030 PER MILLE SIGNO:
        • Nº: 8240
        • UTF-8: E2 80 B0
        • UTF-16: 20 30
      • U+20AC SIGNO DEL EURO:
        • Nº: 8364
        • UTF-8: E2 82 AC
        • UTF-16: 20 AC
      • U+2122 MARCA SIGNO:
        • 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 NEGRO TELÉFONO:
        • Nº: 9742
        • UTF-8: E2 98 8E
        • UTF-16: 26 0E
      • U+2614 PARAGUAS CON LAS GOTAS DE LLUVIA:
        • Nº: 9748
        • UTF-8: E2 98 94
        • UTF-16: 26 14
      • U+263A BLANCO ROSTRO SONRIENTE:
        • 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 ÁTOMO SÍMBOLO:
        • Nº: 9883
        • UTF-8: E2 9A 9B
        • UTF-16: 26 9B
      • U+2708 AVIÓN:
        • Nº: 9992
        • UTF-8: E2 9C 88
        • UTF-16: 27 08
      • U+271E SOMBREADO DE BLANCO EN FORMA DE CRUZ LATINA:
        • Nº: 10014
        • UTF-8: E2 9C 9E
        • UTF-16: 27 1E
      • U+3020 POSTAL DE LA MARCA DE CARA:
        • Nº: 12320
        • UTF-8: E3 80 A0
        • UTF-16: 30 a 20
      • U+8089 CJK UNIFICADA IDEOGRAPH-8089:
        • Nº: 32905
        • UTF-8: E8 82 89
        • UTF-16: 80 89
      • U+1F4A9 PILA DE CACA: 💩
        • Nº: 128169
        • UTF-8: F0 9F 92 A9
        • UTF-16: D8 3D DC A9
      • U+1F680 COHETE: 🚀
        • Nº: 128640
        • UTF-8: F0 9F 9A 80
        • UTF-16: D8 3D DE 80

    Bueno me voy a llevar…

    Hechos divertidos:

    • El unidades de código en UTF-16 son de 16 bits de ancho. Se les mostró con un espacio en el medio, que es engañoso. La representación UTF-16 para © el contrario debería ser 00A9 en lugar de 00 A9 (que sería UTF-16BE).
    • ¿Cuál es la diferencia? No SER soporte para big endian? Él lo escribió en big endian, y así un archivo escrito en big endian UTF-16 sería el mismo como UTF-16BE, ¿verdad?
    • Correcciones: 1) ASCII de 7 bits, un byte son 8 bits, por lo que es mucho más de la mitad. 2) Unicode define cómo codificar los puntos de código. UTF-8, UTF-16 y UTF-32 están definidos en el Estándar Unicode.
    • Creo que s/él quiso que sólo utiliza la mitad de los posibles valores que puede representarse con 8 bits, no es que utiliza la mitad de los bits.
    • Podría haber sido la intención.
    • Me gusta mucho los ejemplos. Destacan por la cual uno puede preferir UTF-16 en UTF-8, por ejemplo. Los desarrolladores de software diferente, puede seleccionar diferentes codificaciones en función de la cual los caracteres Unicode son más propensos a ser utilizados. En China, Japón, por ejemplo, UTF-16 (2 bytes) tiene más sentido que la codificación UTF-8 para ellos, porque los mismos personajes a menudo se necesitaría el doble número de bytes para codificar en UTF-8

  4. 28

    Simplemente hablando Unicode es una norma que asigna un número (llamado punto de código) a todos los personajes de el mundo (Su todavía un trabajo en progreso).

    Ahora lo que necesita para representar este código de puntos utilizando bytes, eso es lo que se llama character encoding. UTF-8, UTF-16, UTF-6 son formas de representar los caracteres.

    UTF-8 es la codificación de caracteres multibyte. Los personajes pueden tener de 1 a 6 bytes (algunos de ellos pueden no ser requeridos por ahora).

    UTF-32 cada uno de los personajes tiene 4 bytes de un personajes.

    UTF-16 utiliza 16 bits para cada carácter y representa sólo una parte de los caracteres Unicode llamado BMP (para todos los propósitos prácticos es suficiente). Java utiliza esta codificación en sus cuerdas.

    • Unicode es un 21 bits conjunto de códigos y 4 bytes es suficiente para representar cualquier carácter Unicode UTF-8. UTF-16 utiliza los sustitutos para representar a los personajes fuera de la BMP (plano multilingüe básico); necesita, ya sea de 2 o 4 bytes para representar cualquier carácter Unicode válido. UCS-2 era de los 16-bits única variante de UTF-16 sin apoyo para los suplentes o los caracteres fuera del BMP.
    • Estás en lo correcto. UTF-8 original tenía 6 bytes para dar cabida a una de 32 bits. Yo en realidad no quería complicar las cosas más de lo que él ya era confundido con wiki doc 🙂
    • Esta respuesta de los estados que UTF-16 no puede codificar BMP puntos de código. Esto es incorrecto, ya que estos pueden ser codificados de la misma forma que en UTF-8 con los pares suplentes. (Usted debe estar pensando en el anticuado UCS-2, antes de Unicode 2.0 salió, que codificado en 16 bits del código de puntos solamente.) También, Java no utilizar UTF-16, se utiliza una forma modificada de la misma, donde el punto de código 0 se codifica de manera diferente.
    • Es el opuesto. La respuesta dice que UTF-16 representa el BMP.
    • Yo equivocado; yo había querido decir «no-BMP». El error en la respuesta es que dice que UTF-16 representa caracteres BMP, que es inexacta. UTF-16 se puede codificar todos los caracteres unicode– no-BMP caracteres están codificados a través de los pares suplentes. Tal vez la respuesta fue confundido con UCS-2.
  5. 13

    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 UTF-16 del límite técnico.

    También es el mayor punto de código UTF-8 puede codificar en 4 bytes, pero la idea detrás de UTF-8 es la codificación también funciona para 5 y 6 byte codificaciones para cubrir puntos de codificación de hasta 7FFFFFFF, es decir. la mitad de lo UTF-32 puede.

  6. 8

    En Unicode, la respuesta no es fácil dado. El problema, como ya se señaló, son las codificaciones.

    Dado ninguna de las frases en inglés sin diacríticos de los personajes, la respuesta para UTF-8 sería como tantos bytes como caracteres y UTF-16 sería el número de caracteres de dos veces.

    La única codificación de donde (como ahora) podemos hacer la afirmación acerca de que el tamaño es UTF-32. No siempre es de 32 bits por carácter, aunque me imagino que los puntos de código están preparados para un futuro UTF-64 🙂

    Lo que lo hace tan difícil de por lo menos dos cosas:

    1. compuesto personajes, donde en lugar de utilizar el carácter de entidad que ya está acentuado/diacrítico (A), un usuario decidió combinar el acento y la base de caracteres (`A).
    2. puntos de código. Puntos de código son el método por el cual el UTF-codificaciones permiten codificar más que el número de bits que les da su nombre, por lo general permiten. E. g. UTF-8 designa ciertos bytes que no son válidos, pero cuando es seguida por una válida continuación byte permitirá describir un personaje más allá de los 8-bit rango de 0..255. Ver el Ejemplos y Extralargo Codificaciones a continuación en el artículo de la Wikipedia en UTF-8.
      • El excelente ejemplo que se da es que los € personaje (punto de código de U+20AC puede ser representado como de tres bytes secuencia E2 82 AC o de cuatro bytes secuencia F0 82 82 AC.
      • Ambos son válidos, y esto demuestra lo complicado que la respuesta es que cuando se habla de «Unicode» y no se trata de una codificación específica de Unicode, UTF-8 o UTF-16.
    • Buen punto acerca de la combinación de caracteres.
  7. 4

    Bien me acaba de sacar hasta la página de la Wikipedia sobre esto, y la de la intro en la parte vi «Unicode pueden ser implementadas por las diferentes codificaciones de caracteres. El más comúnmente usado codificaciones son UTF-8 (que utiliza un byte para todo tipo de caracteres, que tienen el mismo código de valores, tanto en UTF-8 y en la codificación ASCII, y hasta cuatro bytes para otros personajes), el ahora obsoleto UCS-2 (que utiliza dos bytes para cada personaje, pero no puede codificar cada carácter en el actual estándar Unicode)»

    Como esta cita demuestra, su problema es que usted está asumiendo Unicode es una manera única de codificación de caracteres. En realidad, hay varias formas de Unicode, y, de nuevo, en esa cita, uno de ellos incluso tiene 1 byte por carácter igual de lo que estás acostumbrado.

    Por lo que su simple respuesta que desea es que varía.

  8. 3

    Para UTF-16, el carácter de las necesidades de cuatro bytes (dos unidades de código) si se inicia con 0xD800 o mayor; un personaje que se llama un «par suplente.» Más específicamente, un par suplente tiene la forma:

    [0xD800 - 0xDBFF]  [0xDC00 - 0xDFF]
    

    donde […] indica una de dos bytes de código de la unidad con el rango dado. Nada <= 0xD7FF es una unidad de código (de dos bytes). Nada >= 0xE000 no es válida (excepto BOM marcadores, podría decirse).

    Ver http://unicodebook.readthedocs.io/unicode_encodings.html, sección 7.5.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea