¿Por qué hay varias codificaciones Unicode?

40

Pensé que Unicode estaba diseñado para solucionar todo el problema de tener muchas codificaciones diferentes debido a un pequeño espacio de direcciones (8 bits) en la mayoría de los intentos anteriores (ASCII, etc.).

¿Por qué entonces hay tantas codificaciones Unicode? Incluso varias versiones de (esencialmente) la misma, como UTF-8, UTF-16, etc.

    
pregunta Matthew Scharley 20.05.2011 - 07:22

8 respuestas

28

Porque la gente no quiere gastar 21 bits en cada personaje. En todos los sistemas modernos, esto significaría esencialmente el uso de tres bytes por carácter, que es tres veces más de lo que la gente estaba acostumbrada, por lo que no estaban dispuestos a adoptar Unicode en absoluto. Los compromisos debían encontrarse: por ejemplo, UTF-8 es excelente para el texto en inglés porque los archivos ASCII heredados no tienen que convertirse en absoluto, pero es menos útil para los idiomas europeos y de poca utilidad para los idiomas asiáticos.

Básicamente, sí, podríamos haber definido una única codificación universal así como un único gráfico de caracteres universales, pero el mercado no lo habría aceptado.

    
respondido por el Kilian Foth 20.05.2011 - 12:26
37

Unicode es un carácter de 21 bits que codifica la descripción única de "CodePoints", cada uno de los puntos de código está representado por un glifo (una representación gráfica).

  • 16 bits utilizados para identificar un punto de código en un plano (la mayoría de los puntos de código están en el plano 0).
  • 5 bits para identificar el plano.

Las codificaciones admitidas son:

  • UTF-8 (para codificar cada punto usando valores de 8 bits)
  • UTF-16 (para codificar cada punto usando valores de 16 bits)
  • UTF-32 (para codificar cada punto usando valores de 32 bits)

Pero no importa cuál sea la codificación cuando decodifiques, todos se asignan a un punto de código específico que tiene el mismo significado (por lo que es genial).

UTF-8

Este es un formato de tamaño variable. Donde cada punto de código está representado por 1 a 4 bytes.

UTF-16

Este es un formato de tamaño variable. Los puntos de código en el "Plano Multilingüe Básico" (BMP o Plano 0) se pueden representar con un solo valor de 16 bits. Los puntos de código en otros planos están representados por un par suplente (valores de 2 16 bits).

UTF-32

Este es un formato de tamaño fijo. Todos los puntos de código están representados por un solo valor de 32 bits.

    
respondido por el Martin York 20.05.2011 - 07:49
25

Creo que es útil separar las 2 ideas:

  1. Unicode: asignación de caracteres de todo el mundo a puntos de código.
  2. Codificación: asignación de puntos de código a patrones de bits (UTF-8, UTF-16, etc.).

UTF-8, UTF-16 y otras codificaciones tienen ventajas y desventajas propias. Mejor consulte Wikipedia al respecto.

    
respondido por el jfs 20.05.2011 - 07:36
9

UTF-7, UTF-8, UTF-16 y UTF-32 son simplemente formatos de transformación algorítmica de la misma codificación (puntos de código) de los caracteres. Son codificaciones de un sistema de codificación de caracteres.

También son algorítmicamente más fáciles de navegar hacia adelante y hacia atrás que la mayoría de los esquemas anteriores para tratar con conjuntos de caracteres de más de 256 caracteres.

Esto es muy diferente de la codificación de glifos generalmente específica del país y, a veces, del proveedor. Solo en japonés, hubo una tonelada de variaciones de JIS solo, por no mencionar EUC-JP y la transformación orientada a la página de códigos de JIS que las máquinas DOS / Windows usaron llamada Shift-JIS. (Hasta cierto punto, hubo transformaciones algorítmicas de estos, pero no fueron particularmente simples y hubo diferencias específicas de proveedores en los caracteres disponibles. Multiplique esto por un par de cientos de países y la evolución gradual de sistemas de fuentes más sofisticados (después de la pantalla verde era), y tuviste una verdadera pesadilla.

¿Por qué necesitarías estas formas de transformación de Unicode? Debido a que muchos sistemas heredados asumieron secuencias de caracteres de 7 bits de rango ASCII, por lo que necesitaba una solución limpia de 7 bits que pasaba los datos sin daños a través de esos sistemas, entonces necesitaba UTF-7. Luego había sistemas más modernos que podían manejar conjuntos de caracteres de 8 bits, pero los nulos generalmente tenían significados especiales para ellos, por lo que UTF-16 no funcionaba para ellos. 2 bytes podrían codificar todo el plano multilingüe básico de Unicode en su primera encarnación, por lo que UCS-2 parecía un enfoque razonable para los sistemas que iban a ser "conscientes de Unicode desde cero" (como Windows NT y Java VM); luego, las extensiones más allá de eso requerían caracteres adicionales, lo que resultó en la transformación algorítmica de los 21 bits de codificaciones que estaban reservadas por el estándar Unicode, y nacieron pares sustitutos; Eso requería UTF-16. Si tenía alguna aplicación en la que la consistencia del ancho de caracteres fuera más importante que la eficiencia del almacenamiento, UTF-32 (una vez llamado UCS-4) era una opción.

UTF-16 es lo único que es remotamente complejo de tratar, y se mitiga fácilmente por el pequeño rango de caracteres que se ven afectados por esta transformación y el hecho de que las secuencias de 16 bits principales están perfectamente en un rango totalmente distinto de las secuencias de 16 bits finales. También es un mundo más fácil que tratar de avanzar y retroceder en muchas de las primeras codificaciones de Asia Oriental, donde necesitabas una máquina de estados (JIS y EUC) para lidiar con las secuencias de escape, o posiblemente retroceder varios caracteres hasta encontrar algo garantizado Sólo ser un byte principal (Shift-JIS). UTF-16 tenía algunas ventajas en los sistemas que también podían realizar secuencias de 16 bits de manera eficiente.

A menos que tuvieras que vivir las docenas (cientos, realmente) de diferentes codificaciones, o tuvieras que construir sistemas que admitieran múltiples idiomas en diferentes codificaciones a veces incluso en el mismo documento (como WorldScript en las versiones anteriores de MacOs), Usted podría pensar en los formatos de transformación Unicode como una complejidad innecesaria. Pero es una reducción dramática en la complejidad con respecto a las alternativas anteriores, y cada formato resuelve una restricción técnica real. También son realmente convertibles entre sí de manera eficiente, y no requieren tablas de búsqueda complejas.

    
respondido por el JasonTrue 20.05.2011 - 08:16
6

Unicode no fue diseñado para solucionar todo el problema de tener muchas codificaciones diferentes.

Unicode fue diseñado para solucionar todo el problema de un número que representa muchas cosas diferentes dependiendo de la página de códigos en uso. Los números del 0 al 127 representan los mismos caracteres en cualquier página de códigos Ansi. Esto es lo que también se conoce como el gráfico o conjunto de caracteres ASCII. En las páginas de códigos Ansi, que admiten 256 caracteres, los números 128 - 255 representan caracteres diferentes en diferentes páginas de códigos.

Por ejemplo

  • El número $ 57 representa una W mayúscula en todas las páginas de códigos, pero
  • El número $ EC representa el símbolo de inifinidad en la página de códigos 437 (EE. UU.), pero una "LETRA PEQUEÑA LATINA CON CEDILLA" en la página de códigos 775 (Báltico)
  • El signo Cent es el número $ 9B en la página de códigos 437, pero el número 96 en la página de códigos 775

Lo que hizo Unicode fue dar vuelta todo esto al revés. En Unicode no hay "reutilización". Cada número representa un único carácter único. El número $ 00A2 en Unicode es el signo de cent y el signo de cent no aparece en ninguna otra parte de la definición de Unicode.

  

¿Por qué entonces hay tantos Unicode?   codificaciones? Incluso múltiples versiones de   El (esencialmente) mismo, como   UTF-8, UTF-16, etc.

No hay versiones múltiples de la misma codificación. Hay varias codificaciones del mismo mapa de definición de caracteres de Unicode y éstas se han "inventado" para administrar a los requisitos de almacenamiento para diferentes usos de los diversos planos linguales que existen en Unicode.

Unicode define (o tiene el espacio para definir) 4.294.967.295 caracteres únicos. Si desea asignar estos al almacenamiento de disco / memoria sin realizar conversiones algorítmicas, necesita 4 bytes por carácter. Si necesita almacenar textos con caracteres de todos los planos linguales, entonces lo que necesita es probablemente UTF-32 (que es básicamente una codificación de almacenamiento de 4 bytes de la definición de unicode de 1 carácter directo).

Pero casi ningún texto usa caracteres de todos los planos linguales. Y luego usar 4 bytes por carácter parece un gran desperdicio. Especialmente cuando se tiene en cuenta que la mayoría de los idiomas en la Tierra se definen dentro de lo que se conoce como el Plano Multilingüe Básico (BMP): los primeros 65536 números de la definición de Unicode.

Y ahí es donde entró UTF-16. Si solo usas caracteres de BMP, UTF-16 los almacenará muy eficientemente usando solo dos bytes por carácter. Solo usará más bytes para los caracteres fuera del BMP. La distinción entre UTF-16LE (Little Endian) y UTF-16BE (Big Endian) realmente solo tiene algo que ver con cómo se representan los números en la memoria de la computadora (el patrón de bytes A0 significa hexadecimal $ A0 o significa $ 0A).

Si su texto usa menos caracteres diferentes, como la mayoría de los textos en idiomas de Europa occidental, deseará restringir aún más los requisitos de almacenamiento de sus textos. Por lo tanto, UTF-8, que utiliza un solo byte para almacenar los caracteres presentes en la tabla ASCII (los primeros 128 números) y una selección de los caracteres Ansi (los segundos 128 números de las diversas páginas de códigos). Solo utilizará más bytes para los caracteres fuera de este conjunto de "caracteres más utilizados".

Para recapitular:

  • Unicode es un mapeo de los caracteres en todos los idiomas de la tierra (y algunos klingon para arrancar) y luego algunos (matemáticos, musicales, etc.) a un número único.
  • Las codificaciones son algoritmos definidos para almacenar textos utilizando los números de este mapa de caracteres único con el espacio más eficiente posible dado el "uso promedio" de caracteres dentro de los textos.
respondido por el Marjan Venema 20.05.2011 - 08:42
2

Unicode define el mapa entre números y caracteres. Sin embargo, cuando envía un número a un receptor, aún necesita definir cómo representar ese número. Para eso está la UTF. Define cómo representar un número en un flujo de bytes.

    
respondido por el Codism 20.05.2011 - 07:38
2

La razón detrás de UTF-32 es simple: es la representación más directa de los puntos de código Unicode. Entonces, ¿por qué no está todo en UTF-32? Dos razones principales:

Uno es tamaño . UTF-32 requiere 4 bytes para cada carácter. Para el texto que usa solo caracteres en el Lugar Multilingüe Básico, esto es el doble de espacio que UTF-16. Para el texto en inglés, es 4 veces más espacio que US-ASCII.

El motivo principal es compatibilidad con versiones anteriores . Cada codificación Unicode que no sea el UTF-32 "no codificado" fue diseñada para ser compatible con versiones anteriores con un estándar anterior.

  • UTF-8: compatibilidad con versiones anteriores con US-ASCII.
  • UTF-16: compatibilidad con versiones anteriores con UCS-2 (Unicode de 16 bits antes de expandirse más allá del BMP).
  • UTF-7: compatibilidad con versiones anteriores con servidores de correo que no son de 8 bits limpios.
  • GB18030: compatibilidad con versiones anteriores con las codificaciones GB2312 y GBK para chino.
  • UTF-EBCDIC: compatibilidad con versiones anteriores con el subconjunto Latin Basic de EBCDIC.
  

Pensé que Unicode estaba diseñado para solucionar todo el problema de tener muchas codificaciones diferentes

Lo fue, y lo hizo. Es mucho más fácil convertir entre UTF-8, -16 y -32 que tratar con el antiguo sistema de cientos de diferentes codificaciones de caracteres para diferentes idiomas y diferentes sistemas operativos.

    
respondido por el dan04 11.06.2011 - 09:02
1

Sabes que un archivo zip puede comprimir un archivo para que sea mucho más pequeño (especialmente texto) y luego descomprimirlo en una copia idéntica del archivo original.

El algoritmo de compresión realmente tiene varios diferentes algoritmos con diferentes características para elegir: almacenado (sin compresión), Encogido, Reducido (métodos 1-4), Imploded, Tokenizing, Deflated, Deflate64, BZIP2 , LZMA (EFS), WavPack, PPMd, donde teóricamente podría probarlos todos y elegir el mejor resultado, pero generalmente solo va con Deflated.

UTF funciona de la misma manera. Hay varios algoritmos de codificación, cada uno con diferentes características, pero generalmente solo elige UTF-8 porque es ampliamente compatible en comparación con las otras variantes de UTF, que a su vez es porque es compatible a nivel de bit a ASCII de 7 bits, lo que facilita la tarea. se usa en la mayoría de las plataformas de computadoras modernas que usualmente usan una extensión de 8 bits de ASCII.

    
respondido por el user1249 21.05.2011 - 01:54

Lea otras preguntas en las etiquetas

Comentarios Recientes

Unicode está destinado a ser un estándar fácil de usar. Simplifica la interacción entre ASCII, Win32 y xkcd al hacer posible combinar múltiples codificaciones en una sola definición. Por ejemplo, vea Estado actual Gracias por su sitio web. Antes de suscribirse a ese correo electrónico de confirmación de A Year of Unicode. Dentro de 15 días, la pieza se cargará en listas de prueba, publicaciones de la comunidad y redes sociales. Puede comenzar a imprimir el @ HotPlacesUT.js completo. Disfrute a todos <| endoftext... Lee mas