UTF-8 serait-il en mesure de soutenir l'inclusion d'une vaste langue étrangère avec des millions de nouveaux caractères?

86

Au cas où une invasion extraterrestre se produirait et que nous serions obligés de prendre en charge leurs langues dans tous nos systèmes informatiques existants, UTF-8 est-il conçu de manière à prendre en charge leur très grande quantité de caractères?

(Bien sûr, nous ne savons pas si les extraterrestres ont réellement des langues, si ou comment ils communiquent, mais pour l'intérêt de la discussion, imaginez-les, s'il vous plaît.)

Par exemple, si leur langue est constituée de millions de glyphes, de symboles et / ou de combinaisons de caractères récemment trouvés, UTF-8 pourrait-il être théoriquement étendu de manière irréversible pour inclure ces nouveaux glyphes tout en prenant en charge tous les logiciels existants?

Je suis plus intéressé par si les glyphes dépassaient de loin les limitations de taille actuelles et nécessitaient plus d'octets pour représenter un seul glyphe. Dans le cas où UTF-8 ne pourrait pas être étendu, est-ce que cela prouve que le seul avantage par rapport à UTF-32 est simplement la taille des caractères plus bas?

Qix
la source
16
"soutiennent leurs langues " (mon emphase) ... combien? Sommes-nous sûrs que les langues peuvent être décomposées en caractères? Peut-être que le langage est basé sur des relations spatiales. - Voir Ted Chiang "Histoire de votre vie", Histoires de votre vie et des autres . Dans le meilleur des cas, il s’agit simplement d’une question portant sur le nombre maximal d’objets (hors sujet). Au pire, c'est un non-sens spéculatif. (pas clair ce que vous demandez)
Scant Roger
6
@ScantRoger La réponse acceptée répond très bien à la question.
Qix
11
La réponse acceptée fait un excellent travail en nous racontant les faits de UTF-8, UTF-16 et UTF-32. Vous pouvez simplement rechercher ceci sur Wikipedia. En ce qui concerne "l'invasion extraterrestre", je ne vois pas comment la réponse y remédierait.
Scant Roger
10
En rapport (sur le dépassement de pile): UTF-8 est-il suffisant pour toutes les langues courantes?
Yannis
9
Unicode ne prend pas en charge les langues, il prend en charge les caractères - les glyphes utilisés pour représenter le sens sous forme écrite. Beaucoup de langues humaines n'ont pas de script et ne peuvent donc pas être supportées par unicode. Sans parler de nombreux animaux communiquent mais n’ont pas de langue écrite. Unicode ne permet pas la communication sous forme d’illustrations ou de bandes dessinées sans mots, car l’ensemble des glyphes ne sont pas finis. Par définition, nous ne savons pas comment les extraterrestres communiquent, il est donc impossible de répondre à votre question. Si vous voulez juste savoir combien de caractères différents peuvent être gérés par unicode, vous devriez probablement préciser :)
JacquesB

Réponses:

109

Le standard Unicode a beaucoup d’espace libre. Les points de code Unicode sont organisés en "plans" et en "blocs". Sur 17 avions au total, 11 sont actuellement non assignés . Chaque avion contient 65 536 caractères, il est donc réaliste de disposer d'un demi-million de points de code pour une langue étrangère (à moins que nous ne remplissions tout cela avec plus d'émoticônes avant le premier contact). À partir de la version Unicode 8.0, seuls 120 737 points de code ont été attribués au total (environ 10% de la capacité totale), le même montant étant non attribué mais réservé à un usage privé, spécifique à l'application. Au total, 974 530 points de code sont non attribués.

UTF-8 est un codage spécifique d'Unicode et est actuellement limité à quatre octets (octets) par point de code, ce qui correspond aux limites de UTF-16. En particulier, UTF-16 ne prend en charge que 17 avions. Auparavant, UTF-8 prenait en charge 6 octets par point de code et était conçu pour prendre en charge 32768 avions. En principe, cette limite de 4 octets pourrait être supprimée, mais cela casserait la structure organisationnelle actuelle d'Unicode et nécessiterait la suppression progressive du format UTF-16. langues.

La seule raison pour laquelle UTF-16 est encore utilisé, c'est qu'il s'agit d'une extension du codage défectueux UCS-2 qui ne supportait qu'un seul plan Unicode. Il hérite par ailleurs des propriétés indésirables de UTF-8 (non à largeur fixe) et de UTF-32 (non compatible ASCII, perte d’espace pour les données communes) et requiert des marques d’octets pour déclarer l’endianité. Étant donné que, malgré ces problèmes, UTF-16 est toujours populaire, je ne suis pas très optimiste sur le fait que cela va changer très prochainement. Espérons que nos nouveaux seigneurs extraterrestres verront cet obstacle à leur gouvernement et, dans leur sagesse, bannir UTF-16 de la surface de la terre .

Amon
la source
7
En fait, UTF-8 est limité à une partie même de la limite de 4 octets, afin de correspondre à UTF-16. Plus précisément, à 17/32, un peu plus de la moitié.
Déduplicateur
5
En dehors de Windows, je ne connais aucun autre système d’exploitation où le système d’exploitation ou la majorité des programmes du système d’exploitation utilisent UTF16. Les programmes OSX sont généralement UTF8, les programmes Android sont généralement UTF8, Linux sont généralement UTF8. Donc tout ce dont nous avons besoin est que Windows meure (il est déjà en quelque sorte mort dans l'espace mobile)
slebetman
23
À moins que nous remplissions tout cela avec plus d'emoji avant le premier contact ... Voilà. La menace la plus importante pour les interactions pacifiques avec les extraterrestres est l’emoji. Nous sommes condamnés.
Rickster
13
@slebetman Pas vraiment. Tout ce qui est basé sur la JVM utilise UTF-16 (Android également, vous ne savez pas pourquoi vous dites que ce n’est pas le cas), JavaScript utilise UTF-16 et, étant donné que Java et JavaScript sont les langages les plus populaires, UTF-16 ne va nulle part. bientôt.
Malcolm
5
@Kaiserludi "La plupart du code Linux utilise UTF32 pour unicode", ouais, non. Sérieusement, où as-tu eu cette idée? Il n’ya même pas d’ wfopen appel système ni rien d’autre, c’est du UTF8 au complet. Hell même Python et Java - les deux qui définissent des chaînes comme UTF-16 pour des raisons historiques - ne stockent pas les chaînes comme UTF-16 sauf lorsque cela est nécessaire. la mémoire est chère, le processeur est bon marché). Il en va de même pour Android: le JString du NDK est UTF8, principalement parce que les ingénieurs de Google ne sont pas fous.
Voo
30

Si le format UTF-8 doit en fait être étendu, nous devrions examiner le maximum absolu qu'il pourrait représenter. UTF-8 est structuré comme suit:

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

(copié sans vergogne à partir de la RFC .) Nous voyons que le premier octet contrôle toujours le nombre d'octets de suivi composant le caractère actuel.

Si nous l'étendons pour autoriser jusqu'à 8 octets, nous obtenons les représentations supplémentaires non 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

Calculer le maximum de représentations possibles que cette technique nous permet d'arriver

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

ou en base 10:

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

ce qui nous donne le nombre maximal de représentations sous la forme de 4 468 982 745 216.

Donc, si ces 4 milliards ( ou mille milliards de caractères, comme vous s'il vous plait ) sont suffisants pour représenter les langues étrangères, je suis assez convaincu que nous pouvons, avec un minimum d'effort, étendre l'actuel UTF-8 pour faire plaisir à nos nouveaux seigneurs étrangers ;-)

Boldewyn
la source
8
Actuellement, UTF-8 est limité aux points de code jusqu'à 0x10FFFF - mais cela ne concerne que la compatibilité avec UTF-16. S'il était nécessaire de l'étendre, il n'y a aucune ambiguïté sur la façon de l'étendre avec des points de code jusqu'à 0x7FFFFFFF (c'est-à-dire 2³¹-1). Mais au-delà de cela, j'ai vu des définitions contradictoires. Une définition que j'ai vue a 111111xxcomme premier octet possible suivi de cinq octets d'extension pour un maximum de 2³² points de code. Mais cela n’est compatible qu’avec la définition que vous mentionnez pour les premiers 2³¹ points de code.
Kasperd
2
Oui, Wikipedia en dit long sur UTF-16, alors qu’il s’agit en réalité d’Unicode ou d’ISO 10646 (selon le contexte). En réalité, depuis la RFC 3629, UTF-8 n'est pas défini au-delà de U + 10FFFF (ou F4 8F BF BFen octets UTF-8). Donc, tout ce que je mentionne ici au-delà de cela n’est que pure spéculation. Bien sûr, quelqu'un pourrait penser à d'autres extensions, où un premier octet élevé signifie une structure différente (et, espérons-le, ne détruit pas l'auto-synchronisation dans le processus). J'ai essayé de compléter le schéma d'octets pour être aussi proche que possible du vrai UTF-8, cependant.
Boldewyn
4
C'est 4 milliards de dollars, pas quadrillions.
Ypnypn
1
Il n'est pas strictement nécessaire que le nombre d'octets suivants soit toujours égal à un de moins que le nombre d'octets premiers dans le premier octet. En fait, Perl prend en charge (depuis 2000) une variante interne de UTF-8 où les formes à 5, 6 et 7 octets sont identiques à cette réponse, mais FFintroduit une unité de code à 13 octets capable de stocker 72 bits. Tout ce qui dépasse 2 ^ 36 est uniformément très coûteux, mais cela permet de coder un int de 64 bits et plus encore.
Hobbs
7

La norme RFC3629 limite UTF-8 à un maximum de quatre octets par caractère, avec une valeur maximale de 0x10FFFF, permettant un maximum de 1 112 064 points de code. De toute évidence, cette restriction pourrait être supprimée et la norme étendue, mais cela constituerait un changement radical pour le code existant qui fonctionne à cette limite.

Du point de vue des fichiers de données, cela ne constituerait pas un changement radical, car la norme repose sur le principe que si le bit le plus significatif (MSB) de chaque octet est défini, le prochain octet fait partie de l'encodage. Même avant la RFC3629, la norme était limitée à 31 bits, laissant le bit de poids fort du quatrième octet non défini.

L'extension de la norme au-delà de 0x10FFFF romprait cependant la compatibilité partielle des données entre UTF-8 et UTF-16.

David Arno
la source
5
Donc, en théorie, les données seraient rétrocompatibles, mais le code ne serait pas intrinsèquement compatible avec la modification de la norme?
Qix
2
@ Qix, c'est un point valable. Tout fichier UTF-8 existant serait naturellement compatible avec, par exemple, un maximum de 6 octets pour accueillir des millions de points de code supplémentaires, mais de nombreuses bibliothèques existantes conçues pour gérer UTF-8 ne géreraient probablement pas cette extension.
David Arno
4
UTF-16 se briserait fatalement. De manière inhérente, il ne peut prendre en charge que les points de code jusqu’à 0x10FFFF.
gnasher729
1
@ gnasher729: Pas un problème aussi grave qu'on pourrait le penser. Le pré-Unicode a résolu ce problème via des valeurs de décalage (Shift JIS pour le japonais). Ils marqueraient simplement un caractère réservé / inutilisé (0xFFFD?) Comme un "caractère de décalage", qui décale le codage dans une forme plus étendue. Probablement UTF32.
Mooing Duck
4

En réalité, seuls 2 codes de points Unicode représentent un nombre infini de glyphes s’ils combinaient des caractères.

Comparez, par exemple, les deux manières que Unicode code pour l'alphabet coréen Hangul: Hangul Syllables et Hangul Jamo . Le caractère 웃 in Hangul Syllabelsest le code unique C6C3alors Hangul Jamoqu'il contient les trois points de code 110B() 116E(ㅜ) 11B9(). Évidemment, la combinaison de caractères nécessite beaucoup moins de points de code, mais est moins efficace en écriture car il faut plus d'octets pour écrire chaque caractère.

Avec cette astuce, il n’est pas nécessaire d’aller au-delà du nombre de points de code pouvant être actuellement codés en UTF-8 ou UTF-16.

Je suppose que cela dépend de la façon dont les extraterrestres seraient offensés si leur langue nécessitait beaucoup plus d'octets par message que les langues terrestres. Si cela ne les dérange pas, par exemple, de représenter chacun de leurs millions de caractères à l'aide d'un fouillis de 100 000 caractères combinés, il n'y a pas de problème; D'un autre côté, si être obligés d'utiliser plus d'octets que de terriens leur donne l'impression d'être des citoyens de seconde zone, nous pourrions être en conflit (ce qui n'est pas sans rappeler ce que nous observons déjà avec UTF-8 ).

Owen
la source
Ce n'est le cas que si les caractères de la langue étrangère sont en réalité composés d'un ensemble plus limité de graphèmes. Cela pourrait ne pas être le cas.
JacquesB
1
Autant que je sache, il n'est pas nécessaire que la combinaison de caractères se rapporte à des graphèmes individuels. La FAQ Unicode est silencieuse à ce sujet, mais mon impression est qu'il ne serait pas plus difficile pour un moteur de mise en page de prendre en charge les séquences de combinaison qui ne sont pas des séquences de graphèmes, puisqu'un glyphe précomposé serait requis.
Owen
Combien de temps vivent ces extraterrestres et combien de personnages non décomposables en graphèmes peuvent-ils apprendre pendant leur enfance? Et le Hangul précomposé conserve-t-il son avantage d’octets par rapport au Hangul décomposé, même après gzip?
Damian Yerrick
-2

Edit: La question dit maintenant "des millions de nouveaux personnages". Cela facilite la réponse:

Non . Utf-8 est un codage Unicode. Unicode dispose d'un espace de codes qui permet 1 114 112 points de code distincts , et moins d'un million sont actuellement non attribués. Il n'est donc pas possible de prendre en charge des millions de nouveaux caractères dans Unicode. Par définition, aucun codage Unicode ne peut prendre en charge plus de caractères que ceux définis par Unicode. (Bien sûr, vous pouvez tricher en encodant un niveau plus loin - n'importe quel type de données ne peut être représenté que par deux caractères après tout.)


Pour répondre à la question initiale:

Unicode ne prend pas en charge les langues en tant que telles, il prend en charge les caractères - symboles utilisés pour représenter la langue sous forme écrite.

Toutes les langues humaines n’ont pas de représentation écrite. Par conséquent, Unicode ne prend pas en charge toutes les langues humaines. En outre, de nombreux animaux communiquent mais n’ont pas de langue écrite. Les baleines, par exemple, ont une forme de communication assez complexe pour appeler une langue, mais n’ont aucune forme écrite (et ne peuvent pas non plus être capturées par la notation phonétique existante). Donc, même toutes les langues sur terre ne peuvent pas être supportées par Unicode.

Pire encore est quelque chose comme le langage des abeilles. Non seulement il n’a pas de forme écrite, mais il ne peut pas être représenté de manière significative sous forme écrite. La langue est une sorte de danse qui pointe dans une direction mais qui repose sur la position actuelle du soleil. Par conséquent, la danse n’a de valeur d’information qu’à l’endroit et à l’endroit particuliers où elle est exécutée. Une représentation symbolique ou textuelle devrait inclure des informations (emplacement, position du soleil) que le langage des abeilles ne peut actuellement pas exprimer.

Même une forme de communication écrite ou symbolique peut ne pas être possible de représenter en Unicode. Par exemple, les illustrations et les bandes dessinées sans mots ne peuvent pas être prises en charge par Unicode car l'ensemble des glyphes n'est pas fini. Vous remarquerez beaucoup de communication imagée dans les contextes internationaux, comme un aéroport, et il n’est donc pas inconcevable qu’une race d’étrangers voyageant dans l’espace ait évolué pour utiliser un langage imagé.

Même si une race étrangère avait un langage avec un système d'écriture avec un ensemble fini de symboles, ce système pourrait ne pas être pris en charge en Unicode. Unicode s'attend à ce que l'écriture soit une séquence linéaire de symboles. La notation musicale est un exemple de système d'écriture qui ne peut pas être entièrement représenté en Unicode, car la signification est codée à la fois par le choix des symboles et par le placement vertical et horizontal. (Unicode prend en charge les symboles musicaux individuels, mais ne peut pas coder une partition.) Une race extraterrestre qui communiquait à l'aide d'une musique polyphonique (pas rare) ou d'un canal de communication d'une complexité similaire pourrait très bien avoir un système d'écriture ressemblant à une partition d'orchestre. Unicode ne peut pas supporter cela.

Mais supposons, pour des raisons d’argumentation, que toutes les langues, même les langues étrangères, puissent être exprimées sous la forme d’une séquence linéaire de symboles sélectionnés dans un ensemble fini. Unicode est-il assez gros pour une invasion extraterrestre? Unicode a actuellement moins d'un million de points de code non attribués. La langue chinoise contient une centaine de milliers de caractères selon le dictionnaire chinois le plus complet (tous ne sont pas actuellement pris en charge par Unicode en tant que caractères distincts). Ainsi, seules dix langues présentant la complexité du chinois utiliseraient la totalité de l’Unicode. Sur Terre, nous avons des centaines de systèmes d'écriture distincts, mais heureusement, la plupart d'entre eux sont alphabétiques plutôt qu'idéographiques et contiennent donc un petit nombre de caractères. Si toutes les langues écrites utilisaient des idéogrammes tels que le chinois, Unicode ne serait même pas assez grand pour la Terre. L'utilisation des alphabets est dérivée de la parole qui n'utilise qu'un nombre limité de phonèmes, mais cela est particulier pour la physiologie humaine. Ainsi, même une seule planète extraterrestre ne disposant que d’une douzaine de systèmes d’écriture idéographique pourrait dépasser ce que Unicode peut prendre en charge. Maintenant, considérons si cet étranger a déjà envahi d'autres planètes avant la Terre et inclus leurs systèmes d'écriture dans le jeu de caractères à supporter.

L’extension ou la modification des codages actuels, ou l’introduction de nouveaux codages ne résoudra pas ce problème, car le nombre de points de code pris en charge par Unicode est limité.

Donc, la réponse est probablement non.

JacquesB
la source
5
Vous manquez d'imagination. Les chorégraphes de danse ont beaucoup de langage et de terminologie à utiliser pour décrire et enseigner les danses que les acteurs de scène doivent exécuter. Si nous devions savoir ce que les abeilles communiquaient, nous pourrions certainement concevoir une terminologie écrite à cet effet. Après tout, la plupart de nos langues écrites sont aujourd'hui un encodage du son. Le mouvement d'encodage n'est pas si différent du son d'encodage.
Whatsisname
3
Certaines parties de cette réponse sont bonnes, mais dire "Non seulement il n’a pas de forme écrite, il ne peut pas être représenté sous forme écrite" est tout simplement faux. Tout ce qui transmet des informations peut être réduit en bits, et tout ce qui est réduit en bits peut être transformé en un flux de caractères que vous aimez.
Gort le robot
2
@StevenBurnap Vrai, mais Unicode est plus qu'une séquence de bits. C'est une façon d'interpréter ces bits, qui est assez rigide. Oui, le jeu de caractères Unicode pourrait être étendu pour représenter n'importe quoi, des images aux instructions de la CNC, mais ce serait une créature très différente.
Owen
4
Gardez à l'esprit que les symboles Unicode décrivent (dans la plupart des langues) des modèles de variation de la pression atmosphérique et que, dans la plupart des langues, cela correspond en fait à un travail assez déplorable.
Gort le robot
3
Donc, vous voulez dire que la phrase "voler 45 secondes avec le soleil à 15 degrés sur votre gauche, puis voler 10 secondes avec le soleil à 10 degrés sur votre droite" est impossible? Cela exige certainement la position du soleil à l’époque en tant que contexte.
Gort le robot