¿Sería UTF-8 capaz de soportar la inclusión de un vasto lenguaje alienígena con millones de caracteres nuevos?

86

En el caso de que ocurriera una invasión extraterrestre y nos viéramos obligados a admitir sus idiomas en todos nuestros sistemas informáticos existentes, ¿está diseñado UTF-8 de una manera que permita su gran cantidad de caracteres?

(Por supuesto, no sabemos si los extraterrestres realmente tienen idiomas, si o cómo se comunican, pero por el argumento, imagínense que sí).

Por ejemplo, si su lenguaje consistiera en millones de glifos, símbolos y / o caracteres combinados recién descubiertos , ¿podría UTF-8 teóricamente expandirse de una manera ininterrumpida para incluir estos nuevos glifos y aún admitir todo el software existente?

Me interesa más si los glifos superan con creces las limitaciones de tamaño actuales y requieren más bytes para representar un solo glifo. En el caso de que UTF-8 no pueda expandirse, ¿eso prueba que la ventaja única sobre UTF-32 es simplemente el tamaño de los caracteres más bajos?

Qix
fuente
16
"apoyar sus idiomas " (mi énfasis) ... ¿Cuántos? ¿Estamos seguros de que los idiomas se pueden dividir en caracteres? Quizás el lenguaje se base en relaciones espaciales. - ver Ted Chiang "Historia de tu vida", Historias de tu vida y otras . En el mejor de los casos, esta es simplemente una pregunta de max-things-in-X-bytes (fuera de tema). En el peor de los casos, son tonterías especulativas. (no está claro lo que estás preguntando)
Scant Roger
66
@ScantRoger La respuesta aceptada hace un buen trabajo al responder la pregunta como se pretendía.
Qix
11
La respuesta aceptada hace un buen trabajo al contarnos los hechos de UTF-8, UTF-16 y UTF-32. Simplemente puedes buscar esto en Wikipedia. En cuanto a la "invasión alienígena", no veo cómo la respuesta lo aborda en absoluto.
Escaso Roger
10
Relacionado (en el desbordamiento de pila): ¿UTF-8 es suficiente para todos los idiomas comunes?
Yannis
99
Unicode no admite idiomas, admite caracteres , glifos utilizados para representar el significado en forma escrita. Muchos lenguajes humanos no tienen un script y, por lo tanto, no pueden ser compatibles con Unicode. Sin mencionar que muchos animales se comunican pero no tienen un lenguaje escrito. La comunicación mediante ejemplos o cómics sin palabras no puede ser compatible con Unicode, ya que el conjunto de glifos no es finito. Por definición, no sabemos cómo se comunican los extraterrestres, por lo que su pregunta es imposible de responder. Si solo quieres saber cuántos caracteres distintos puede admitir Unicode, probablemente deberías aclarar :)
JacquesB

Respuestas:

109

El estándar Unicode tiene mucho espacio de sobra. Los puntos de código Unicode están organizados en "planos" y "bloques". Del total de 17 aviones, hay 11 actualmente sin asignar . Cada avión tiene 65.536 caracteres, por lo que hay medio millón de puntos de código de sobra para un idioma extraño (a menos que lo llenemos todo con más emoji antes del primer contacto). A partir de Unicode 8.0, solo se han asignado 120,737 puntos de código en total (aproximadamente el 10% de la capacidad total), con aproximadamente la misma cantidad sin asignar pero reservada para uso privado específico de la aplicación. En total, 974,530 puntos de código no están asignados.

UTF-8 es una codificación específica de Unicode, y actualmente está limitada a cuatro octetos (bytes) por punto de código, lo que coincide con las limitaciones de UTF-16. En particular, UTF-16 solo admite 17 planos. Anteriormente, UTF-8 soportaba 6 octetos por punto de código, y fue diseñado para soportar 32768 planos. En principio, este límite de 4 bytes podría levantarse, pero eso rompería la estructura organizativa actual de Unicode y requeriría la eliminación gradual de UTF-16, lo que es poco probable que ocurra en el futuro cercano considerando lo arraigado que está en ciertos sistemas operativos y programación. idiomas

La única razón por la que UTF-16 todavía es de uso común es que es una extensión de la codificación UCS-2 defectuosa que solo admite un solo plano Unicode. De lo contrario, hereda propiedades indeseables tanto de UTF-8 (no de ancho fijo) como de UTF-32 (no compatible con ASCII, pérdida de espacio para datos comunes), y requiere marcas de orden de bytes para declarar endianness. Dado que a pesar de estos problemas, UTF-16 sigue siendo popular, no soy demasiado optimista de que esto vaya a cambiar por sí solo muy pronto. Con suerte, nuestros nuevos Alien Overlords verán este impedimento para su gobierno, y en su sabiduría desterrarán a UTF-16 de la faz de la tierra .

amon
fuente
77
En realidad, UTF-8 se limita a solo una parte, incluso del límite de 4 bytes, para que coincida con UTF-16. Específicamente, a 17/32, un poco más de la mitad.
Deduplicador
55
Fuera de Windows, no conozco ningún otro sistema operativo donde el sistema operativo o la mayoría de los programas del sistema operativo utilicen UTF16. Los programas OSX suelen ser UTF8, los programas de Android suelen ser UTF8, Linux suelen ser UTF8. Entonces, todo lo que necesitamos es que Windows muera (ya está muerto en el espacio móvil)
slebetman
23
A menos que completemos todo eso con más emoji antes del primer contacto ... Ahí lo tienes. La amenaza más importante para la interacción pacífica con los extraterrestres es el emoji. Estamos condenados.
rickster
13
@Slebetman No realmente. Cualquier cosa basada en JVM usa UTF-16 (Android también, no estoy seguro de por qué dices que no), JavaScript usa UTF-16, y dado que Java y JavaScript son los idiomas más populares, UTF-16 no irá a ningún lado en ningún momento pronto.
Malcolm
55
@Kaiserludi "La mayoría del código de Linux usa UTF32 para Unicode", sí, no. En serio, ¿de dónde demonios sacaste esa idea? Ni siquiera hay una wfopen llamada al sistema o cualquier otra cosa, es UTF8 hasta el final. Demonios, incluso Python y Java, ambos que definen cadenas como UTF-16 debido a razones históricas, no almacenan cadenas como UTF-16, excepto cuando sea necesario ... grandes beneficios de memoria y ningún impacto en el rendimiento (y eso a pesar del código adicional para manejar las conversiones) la memoria es cara, la CPU es barata). Lo mismo ocurre con Android: el JString del NDK es UTF8, principalmente porque los ingenieros de Google no están locos.
Voo
30

Si UTF-8 se va a extender, deberíamos ver el máximo absoluto que podría representar. UTF-8 está estructurado así:

Char. number range  |        UTF-8 octet sequence
   (hexadecimal)    |              (binary)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

(copiado descaradamente del RFC ). Vemos que el primer byte siempre controla cuántos bytes de seguimiento forman el carácter actual.

Si lo ampliamos para permitir hasta 8 bytes, obtenemos representaciones adicionales que no son Unicode

111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
11111110 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
11111111 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

Calculando las máximas representaciones posibles que esta técnica permite llegar a

  10000000₂
+ 00100000₂ * 01000000₂
+ 00010000₂ * 01000000₂^2
+ 00001000₂ * 01000000₂^3
+ 00000100₂ * 01000000₂^4
+ 00000010₂ * 01000000₂^5
+ 00000001₂ * 01000000₂^6
+ 00000001₂ * 01000000₂^7

o en base 10:

  128
+  32 * 64
+  16 * 64^2
+   8 * 64^3
+   4 * 64^4
+   2 * 64^5
+   1 * 64^6
+   1 * 64^7

lo que nos da la cantidad máxima de representaciones como 4,468,982,745,216.

Entonces, si estos 4 mil millones ( o trillones, como quieras ) son suficientes para representar los idiomas extraterrestres, estoy bastante seguro de que podemos, con un mínimo esfuerzo, extender el UTF-8 actual para complacer a nuestros nuevos señores extraterrestres ;-)

Boldewyn
fuente
8
Actualmente, UTF-8 está limitado a solo puntos de código hasta 0x10FFFF, pero eso es solo por compatibilidad con UTF-16. Si era necesario extenderlo, no hay ambigüedad sobre cómo extenderlo con puntos de código hasta 0x7FFFFFFF (eso es 2³¹-1). Pero más allá de eso, he visto definiciones contradictorias. Una definición que he visto tiene 111111xxcomo posible primer byte seguido de cinco bytes de extensión para un máximo de 2 ² puntos de código. Pero eso solo es compatible con la definición que menciona para los primeros puntos de código de 2³¹.
kasperd
2
Sí, Wikipedia dice algo sobre UTF-16, cuando realmente significan Unicode o ISO 10646 (según el contexto). En realidad, desde RFC 3629, UTF-8 está indefinido más allá de U + 10FFFF (o F4 8F BF BFen bytes UTF-8). Entonces, todo lo que menciono aquí más allá de eso es pura especulación. Por supuesto, alguien podría pensar en otras extensiones, donde un primer byte alto significa otra estructura que sigue (y con suerte no destruirá la auto sincronización en el proceso). Sin embargo, intenté completar el esquema de bytes para estar lo más cerca posible del UTF-8 real.
Boldewyn
44
Eso es 4 billones, no billones.
Ypnypn
1
No es estrictamente necesario que el número de bytes siguientes sea siempre uno menor que el número de bytes iniciales en el primer byte. Perl en realidad admite (desde 2000) una variante interna de UTF-8 donde las formas de 5, 6 y 7 bytes son las mismas que esta respuesta, pero FFintroduce una unidad de código de 13 bytes capaz de almacenar 72 bits. Cualquier cosa por encima de 2 ^ 36 es uniformemente muy costoso, pero permite codificar un int de 64 bits y algo más.
hobbs
7

RFC3629 restringe UTF-8 a un máximo de cuatro bytes por carácter, con un valor máximo de 0x10FFFF, lo que permite un máximo de 1.112.064 puntos de código. Obviamente, esta restricción podría eliminarse y ampliarse el estándar, pero esto probaría un cambio radical para el código existente que funciona hasta ese límite.

Desde el punto de vista del archivo de datos, esto no sería un cambio radical ya que el estándar funciona sobre la base de que si se establece el bit más significativo (MSB) de cada byte, el siguiente byte es parte de la codificación. Incluso antes de RFC3629, el estándar estaba limitado a 31 bits, dejando el MSB del cuarto byte sin configurar.

Sin embargo, extender el estándar más allá de 0x10FFFF rompería la compatibilidad parcial de datos de UTF-8 con UTF-16.

David Arno
fuente
55
Entonces, en teoría, los datos serían compatibles con versiones anteriores, pero el código no sería inherentemente compatible con la modificación del estándar.
Qix
2
@ Qix, ese es un punto válido. Cualquier archivo UTF-8 existente sería naturalmente compatible con, por ejemplo, un máximo de 6 bytes para acomodar millones de puntos de código más, pero muchas bibliotecas existentes diseñadas para manejar UTF-8 probablemente no manejarían esa extensión.
David Arno
44
UTF-16 se rompería fatalmente. Inherentemente solo puede admitir puntos de código de hasta 0x10FFFF.
gnasher729
1
@ gnasher729: No es un problema tan grande como parece. Pre-Unicode resolvió esto mediante valores de cambio (Shift JIS para japonés). Simplemente marcarían un carácter reservado / no utilizado (0xFFFD?) Como un "carácter de cambio", que cambia la codificación a una forma más extendida. Probablemente UTF32.
Mooing Duck
4

Realmente, solo 2 códigos de puntos de código Unicode representan infinitos glifos, si combinaran caracteres.

Compare, por ejemplo, las dos formas en que Unicode codifica para el alfabeto coreano Hangul: Hangul Syllables y Hangul Jamo . El carácter 웃 en Hangul Syllabelses el punto de código único, C6C3mientras que en Hangul Jamoél están los tres puntos de código 110B(ㅇ) 116E(ㅜ) 11B9(ㅅ). Obviamente, el uso de caracteres combinados requiere muchos menos puntos de código, pero es menos eficiente para escribir porque se necesitan más bytes para escribir cada carácter.

Con este truco, no hay necesidad de ir más allá del número de puntos de código que actualmente se pueden codificar en UTF-8 o UTF-16.

Supongo que todo se reduce a lo ofendidos que estarían los extraterrestres si su idioma requería muchos más bytes por mensaje que los idiomas terrenales. Si no les importa, por ejemplo, representar a cada uno de sus millones de caracteres usando una mezcla de, 100k caracteres combinados, entonces no hay problema; Por otro lado, si ser forzados a usar más bytes que los terrícolas los hace sentir ciudadanos de segunda clase, podríamos tener algún conflicto ( no muy diferente de lo que ya observamos con UTF-8 ).

Owen
fuente
Este es solo el caso si los personajes en el idioma alienígena en realidad están compuestos de un conjunto más limitado de grafemas. Este podría no ser el caso.
JacquesB
1
Hasta donde yo sé, no hay ningún requisito de que la combinación de caracteres deba relacionarse con grafemas individuales. Las preguntas frecuentes de Unicode no dicen nada al respecto, pero mi impresión es que no sería más difícil para un motor de diseño admitir secuencias de peinado que no son secuencias de grafemas, ya que en cualquier caso se requeriría un glifo precompuesto.
Owen
¿Cuánto tiempo viven estos extraterrestres y cuántos personajes no descomponibles en grafemas pueden aprender durante la infancia? ¿Y Hangul precompuesto conserva su ventaja de byte sobre Hangul descompuesto incluso después de gzip?
Damian Yerrick
-2

Editar: La pregunta ahora dice "millones de nuevos personajes". Esto facilita la respuesta:

No se . Utf-8 es una codificación Unicode. Unicode tiene un espacio de código que permite 1,114,112 puntos de código distintos , y actualmente menos de un millón no está asignado. Por lo tanto, no es posible admitir millones de caracteres nuevos en Unicode. Por definición, ninguna codificación Unicode puede admitir más caracteres de los que define Unicode. (Por supuesto, puede hacer trampas al codificar un nivel adicional; cualquier tipo de datos puede representarse con solo dos caracteres después de todo).


Para responder la pregunta original:

Unicode no admite idiomas como tales, admite caracteres, símbolos utilizados para representar el idioma en forma escrita.

No todos los lenguajes humanos tienen una representación escrita, por lo que no todos los lenguajes humanos pueden ser compatibles con Unicode. Además, muchos animales se comunican pero no tienen un lenguaje escrito. Las ballenas, por ejemplo, tienen una forma de comunicación que es lo suficientemente compleja como para llamar a un idioma, pero no tiene ninguna forma escrita (y tampoco puede ser capturada por la notación fonética existente). Por lo tanto, ni siquiera todos los idiomas en la tierra pueden ser compatibles con Unicode.

Peor aún es algo como el lenguaje de las abejas. No solo no tiene una forma escrita, no puede representarse significativamente en forma escrita. El lenguaje es un tipo de baile que básicamente apunta en una dirección pero se basa en la posición actual del sol. Por lo tanto, el baile solo tiene valor informativo en el lugar y momento particular donde se realiza. Una representación simbólica o textual debería incluir información (ubicación, posición del sol) que el lenguaje de las abejas actualmente no puede expresar.

Incluso una forma de comunicación escrita o simbólica podría no ser posible representar en Unicode. Por ejemplo, Unicode no puede admitir ilustraciones o cómics sin palabras, ya que el conjunto de glifos no es finito. Notarás mucha comunicación pictórica en entornos internacionales como un aeropuerto, por lo que no es inconcebible que una raza de extraterrestres que viajan al espacio haya evolucionado para usar un lenguaje pictórico.

Incluso si una raza alienígena tuviera un lenguaje con un sistema de escritura con un conjunto finito de símbolos, este sistema podría no ser compatible con Unicode. Unicode espera que la escritura sea una secuencia lineal de símbolos. La notación musical es un ejemplo de un sistema de escritura que no se puede representar completamente en Unicode, porque el significado está codificado tanto en la elección de símbolos como en la colocación vertical y horizontal. (Unicode admite símbolos musicales individuales, pero no puede codificar una partitura). Una raza alienígena que se comunicó utilizando música polifónica (no es raro) o un canal de comunicación de complejidad similar, podría muy bien tener un sistema de escritura que parezca una partitura orquestal, y Unicode no puede soportar esto.

Pero, por el simple argumento, supongamos que todos los idiomas, incluso los idiomas extraños, pueden expresarse como una secuencia lineal de símbolos seleccionados de un conjunto finito. ¿Es Unicode lo suficientemente grande como para una invasión alienígena? Unicode tiene actualmente menos de un millón de puntos de código sin asignar. El idioma chino contiene cien mil caracteres de acuerdo con el diccionario chino más completo (actualmente, Unicode no admite todos ellos como caracteres distintos). Entonces, solo diez idiomas con la complejidad del chino usarían todo Unicode. En la tierra tenemos cientos de sistemas de escritura distintos, pero afortunadamente la mayoría son alfabéticos en lugar de ideográficos y, por lo tanto, contienen una pequeña cantidad de caracteres. Si todos los idiomas escritos usaran ideogramas como el chino, Unicode ni siquiera sería lo suficientemente grande para la Tierra. El uso de alfabetos se deriva del habla, que solo usa un número limitado de fonemas, pero eso es particular para la fisiología humana. Entonces, incluso un solo planeta alienígena con solo una docena de sistemas de escritura ideográfica podría exceder lo que Unicode puede soportar. Ahora considere si este alienígena ya ha invadido otros planetas antes de la Tierra e incluyó sus sistemas de escritura en el conjunto de caracteres que deben ser compatibles.

La expansión o modificación de las codificaciones actuales, o la introducción de nuevas codificaciones no resolverán esto, ya que la limitación está en el número de puntos de código admitidos por Unicode.

Entonces la respuesta es más probable que no.

JacquesB
fuente
55
Te falta imaginación. Los coreógrafos de baile tienen mucho lenguaje y terminología que pueden usar para describir y enseñar los bailes que los actores de teatro deben realizar. Si tuviéramos que saber qué se comunicaban las abejas, definitivamente podríamos diseñar una terminología escrita para ello. Después de todo, la mayoría de nuestros idiomas escritos hoy son una codificación de sonido. El movimiento de codificación no es tan diferente del sonido de codificación.
whatsisname
3
Algunas partes de esta respuesta son buenas, pero decir "No solo no tiene una forma escrita, no puede representarse en forma escrita" es simplemente incorrecto. Cualquier cosa que transmita información puede reducirse a bits, y cualquier cosa reducida a bits puede transformarse en prácticamente cualquier secuencia de caracteres que desee.
Steven Burnap
2
@StevenBurnap Verdadero, pero Unicode es más que solo una secuencia de bits. Es una forma de interpretar esos bits, que es bastante rígida. Sí, el conjunto de caracteres Unicode podría expandirse para representar cualquier cosa, desde imágenes hasta instrucciones de CNC, pero esta sería una criatura muy diferente.
Owen
44
Tenga en cuenta que lo que los símbolos Unicode describen (en la mayoría de los idiomas) son patrones en la variación de la presión del aire, y que para la mayoría de los idiomas en realidad hace un trabajo bastante desagradable al hacer coincidir esos patrones.
Steven Burnap
3
¿Entonces quiere decir que la frase "vuela 45 segundos con el sol 15 grados a la izquierda, luego vuela 10 segundos con el sol 10 grados a la derecha" es imposible? Ciertamente requiere la posición del sol en ese momento como contexto.
Steven Burnap