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?
Respuestas:
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 .
fuente
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.Si UTF-8 se va a extender, deberíamos ver el máximo absoluto que podría representar. UTF-8 está estructurado así:
(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
Calculando las máximas representaciones posibles que esta técnica permite llegar a
o en base 10:
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 ;-)
fuente
111111xx
como 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³¹.F4 8F BF BF
en 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.FF
introduce 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.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.
fuente
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 Syllabels
es el punto de código único,C6C3
mientras que enHangul Jamo
él están los tres puntos de código110B
(ㅇ)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 ).
fuente
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.
fuente