UTF-8 sarebbe in grado di supportare l'inclusione di una vasta lingua aliena con milioni di nuovi personaggi?


86

Nel caso in cui si verificasse un'invasione aliena e siamo stati costretti a supportare le loro lingue in tutti i nostri sistemi informatici esistenti, UTF-8 è progettato in modo da consentire la loro immensa quantità di personaggi?

(Certo, non sappiamo se gli alieni abbiano effettivamente delle lingue, se o come comunichino, ma per il bene dell'argomento, per favore, immagina di sì.)

Ad esempio, se il loro linguaggio fosse costituito da milioni di glifi, simboli e / o caratteri combinati nuovi, UTF-8 potrebbe teoricamente essere espanso in modo continuo per includere questi nuovi glifi e supportare ancora tutto il software esistente?

Sono più interessato a se i glifi superano di gran lunga le attuali limitazioni di dimensione e richiedono più byte per rappresentare un singolo glifo. Nel caso in cui UTF-8 non potesse essere ampliato, ciò dimostra che il vantaggio singolo rispetto a UTF-32 è semplicemente la dimensione di caratteri inferiori?


16
"supporta le loro lingue " (la mia enfasi) ... Quante? Siamo sicuri che le lingue possano essere suddivise in caratteri? Forse il linguaggio si basa su relazioni spaziali. - vedi Ted Chiang "Storia della tua vita", Storie della tua vita e altri . Nella migliore delle ipotesi, questa è semplicemente una domanda max-things-in-X-bytes (off-topic). Nel peggiore dei casi, è un'assurdità speculativa. (non chiarisci quello che stai chiedendo)
Scant Roger

6
@ScantRoger La risposta accettata fa un ottimo lavoro nel rispondere alla domanda come previsto.
Qix,

11
La risposta accettata fa un ottimo lavoro nel dirci i fatti di UTF-8, UTF-16 e UTF-32. Potresti semplicemente cercarlo su Wikipedia. Per quanto riguarda "invasione aliena", non vedo come la risposta la affronti affatto.
Scant Roger


9
Unicode non supporta le lingue, supporta i caratteri - glifi usati per rappresentare il significato in forma scritta. Molti linguaggi umani non hanno una sceneggiatura e quindi non possono essere supportati dall'unicode. Per non parlare del fatto che molti animali comunicano ma non hanno una lingua scritta. La comunicazione di illustrazioni o fumetti senza parole non può essere supportata da Unicode poiché l'insieme di glifi non è finito. Per definizione non sappiamo come comunicano gli alieni, quindi è impossibile rispondere alla tua domanda. Se vuoi solo sapere quanti caratteri distinti unicode può supportare, probabilmente dovresti chiarire :)
JacquesB,

Risposte:


109

Lo standard Unicode ha molto spazio libero. I punti di codice Unicode sono organizzati in "piani" e "blocchi". Di 17 aerei totali, 11 sono attualmente non assegnati . Ogni piano contiene 65.536 caratteri, quindi c'è realisticamente mezzo milione di punti di codice da risparmiare per una lingua aliena (a meno che non riempiamo tutto questo con più emoji prima del primo contatto). A partire da Unicode 8.0, sono stati assegnati in totale solo 120.737 punti di codice (circa il 10% della capacità totale), con circa lo stesso importo non assegnato ma riservato per uso privato specifico dell'applicazione. In totale, 974.530 punti di codice non sono assegnati.

UTF-8 è una codifica specifica di Unicode ed è attualmente limitata a quattro ottetti (byte) per punto di codice, che corrisponde ai limiti di UTF-16. In particolare, UTF-16 supporta solo 17 aerei. In precedenza, UTF-8 supportava 6 ottetti per punto di codice ed era progettato per supportare 32768 aerei. In linea di principio questo limite di 4 byte potrebbe essere revocato, ma ciò spezzerebbe l'attuale struttura organizzativa di Unicode e richiederebbe la graduale eliminazione dell'UTF-16 - che probabilmente non si verificherà nel prossimo futuro considerando quanto sia radicato in alcuni sistemi operativi e programmi le lingue.

L'unico motivo per cui UTF-16 è ancora di uso comune è che si tratta di un'estensione della codifica UCS-2 difettosa che supportava solo un singolo piano Unicode. In caso contrario, eredita proprietà indesiderabili sia da UTF-8 (non a larghezza fissa) sia da UTF-32 (non compatibile ASCII, spreco di spazio per i dati comuni) e richiede segni di ordine byte per dichiarare l'endianità. Dato che nonostante questi problemi UTF-16 è ancora popolare, non sono troppo ottimista sul fatto che questo cambierà da solo molto presto. Speriamo che i nostri nuovi Sovrani Alieni vedranno questo impedimento al loro dominio e nella loro saggezza bandiranno UTF-16 dalla faccia della terra .


7
In realtà, UTF-8 è limitato a solo una parte del limite di 4 byte, al fine di corrispondere a UTF-16. In particolare, a 17/32 di esso, leggermente più della metà.
Deduplicatore,

5
Al di fuori di Windows, non conosco nessun altro sistema operativo in cui né il sistema operativo né la maggior parte dei programmi sul sistema operativo utilizzino UTF16. I programmi OSX sono in genere UTF8, i programmi Android sono in genere UTF8, Linux in genere UTF8. Quindi tutto ciò di cui abbiamo bisogno è che Windows muoia (è già un po 'morto nello spazio mobile)
slebetman

23
A meno che non riempiamo tutto questo con più emoji prima del primo contatto ... Ecco qua. La minaccia più significativa all'interazione pacifica con gli alieni è l'emoji. Siamo condannati.
rickster,

13
@slebetman Non proprio. Qualsiasi cosa basata su JVM utilizza UTF-16 (anche Android, non so perché lo dici), JavaScript utilizza UTF-16 e dato che Java e JavaScript sono le lingue più popolari, UTF-16 non va ovunque in qualsiasi momento presto.
Malcolm,

5
@Kaiserludi "La maggior parte del codice Linux utilizza UTF32 per Unicode", sì, no. Davvero dove diavolo hai avuto quell'idea? Non c'è nemmeno un wfopen syscall o altro, è UTF8 fino in fondo. Al diavolo persino Python e Java - entrambi che definiscono le stringhe come UTF-16 per motivi storici - non memorizzano le stringhe come UTF-16 tranne quando necessario .. grandi vantaggi di memoria e nessun hit di prestazione (e che nonostante il codice aggiuntivo per gestire le conversioni - la memoria è costosa, la CPU costa poco). Lo stesso vale per Android: JString di NDK è UTF8, soprattutto perché gli ingegneri di Google non sono pazzi.
Voo,

30

Se UTF-8 deve essere effettivamente esteso, dovremmo guardare al massimo assoluto che potrebbe rappresentare. UTF-8 è strutturato in questo modo:

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

(copiato spudoratamente dall'RFC .) Vediamo che il primo byte controlla sempre quanti byte di follow-up compongono il carattere corrente.

Se lo estendiamo per consentire fino a 8 byte otteniamo le rappresentazioni aggiuntive 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

Calcolando le rappresentazioni massime possibili a cui questa tecnica consente di arrivare

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

o nella base 10:

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

che ci dà il numero massimo di rappresentazioni pari a 4.468.982.745.216.

Quindi, se questi 4 miliardi ( o trilioni, a piacere ) sono sufficienti per rappresentare le lingue aliene, sono abbastanza sicuro che possiamo, con il minimo sforzo, estendere l'attuale UTF-8 per soddisfare i nostri nuovi signori alieni ;-)


8
Attualmente UTF-8 è limitato a soli punti di codice fino a 0x10FFFF, ma è solo per compatibilità con UTF-16. Se fosse necessario estenderlo, non vi è alcuna ambiguità su come estenderlo con punti di codice fino a 0x7FFFFFFF (ovvero 2³¹-1). Ma oltre a ciò ho visto definizioni contrastanti. Una definizione che ho visto ha 111111xxcome primo byte possibile seguito da cinque byte di estensione per un massimo di 2³² di punti codice. Ma questo è compatibile solo con la definizione menzionata per i primi punti di codice 2³¹.
Kasperd,

2
Sì, Wikipedia dice qualcosa su UTF-16, quando in realtà significano Unicode o ISO 10646 (a seconda del contesto). In realtà, da RFC 3629, UTF-8 non è definito oltre U + 10FFFF (o F4 8F BF BFin byte UTF-8). Quindi, tutto ciò che menziono qui oltre è pura speculazione. Certo, qualcuno potrebbe pensare ad altre estensioni, in cui un primo byte alto indica qualche altra struttura che segue (e si spera non distrugga l'auto-sincronizzazione nel processo). Ho provato a completare lo schema di byte per essere il più vicino possibile al reale UTF-8.
Boldewyn,

4
Sono 4 trilioni, non quadrilioni.
Ypnypn,

1
Non è strettamente necessario che il numero di byte seguenti sia sempre uno in meno del numero di byte iniziali nel primo byte. Perl attualmente supporta (dal 2000) una variante interna di UTF-8 in cui le forme a 5, 6 e 7 byte sono uguali a questa risposta, ma FFintroduce un'unità di codice a 13 byte in grado di memorizzare 72 bit. Qualsiasi cosa oltre 2 ^ 36 è uniformemente molto costosa, ma consente di codificare un int a 64 bit e poi alcuni.
Hobbs

7

RFC3629 limita UTF-8 a un massimo di quattro byte per carattere, con un valore massimo di 0x10FFFF, consentendo un massimo di 1.112.064 punti di codice. Ovviamente questa restrizione potrebbe essere rimossa e la norma estesa, ma ciò proverebbe una rottura del codice esistente che funziona fino a quel limite.

Dal punto di vista del file di dati, questo non sarebbe un cambiamento sostanziale poiché lo standard funziona in base al fatto che se viene impostato il bit più significativo (MSB) di ciascun byte, il byte successivo fa parte della codifica. Anche prima di RFC3629, lo standard era limitato a 31 bit, lasciando disinserito l'MSB del quarto byte.

L'estensione dello standard oltre 0x10FFFF comprometterebbe la parziale compatibilità dei dati di UTF-8 con UTF-16.


5
Quindi, in teoria, i dati sarebbero retrocompatibili, ma il codice non sarebbe intrinsecamente compatibile con la modifica dello standard?
Qix,

2
@Qix, questo è un punto valido. Qualsiasi file UTF-8 esistente sarebbe naturalmente compatibile con, ad esempio, un massimo di 6 byte per contenere milioni di punti di codice in più, ma molte librerie esistenti progettate per gestire UTF-8 probabilmente non gestiranno tale estensione.
David Arno,

4
UTF-16 si spezzerebbe fatalmente. Può intrinsecamente supportare solo punti di codice fino a 0x10FFFF.
gnasher729,

1
@ gnasher729: non è un grosso problema come pensi. Pre-Unicode risolto questo tramite valori di spostamento (Shift JIS per il giapponese). Contrassegnerebbero semplicemente un carattere riservato / inutilizzato (0xFFFD?) Come "carattere di spostamento", che sposta la codifica in una forma più estesa. Probabilmente UTF32.
Mooing Duck il

4

In realtà, solo 2 codici Unicode indicano un numero infinito di glifi, se combinano caratteri.

Confronta, ad esempio, i due modi in cui Unicode codifica per l'alfabeto coreano Hangul: Hangul Syllables e Hangul Jamo . Il carattere 웃 in Hangul Syllabelsè il singolo punto di codice C6C3mentre in Hangul Jamoesso sono i tre punti di codice 110B(ㅇ) 116E(ㅜ) 11B9(ㅅ). Ovviamente, l'uso della combinazione di caratteri occupa notevolmente meno punti di codice, ma è meno efficiente per la scrittura perché sono necessari più byte per scrivere ogni carattere.

Con questo trucco, non è necessario andare oltre il numero di punti di codice che attualmente possono essere codificati in UTF-8 o UTF-16.

Immagino che dipenda da quanto sarebbero offesi gli alieni se la loro lingua richiedesse molti più byte per messaggio rispetto alle lingue terrene. Se a loro non importa, diciamo, che rappresentano ciascuno dei loro milioni di personaggi usando un miscuglio di dire, 100k che combinano personaggi, allora non c'è problema; d'altra parte, se essere costretti a usare più byte dei terrestri li fa sentire cittadini di seconda classe, potremmo trovarci in qualche conflitto ( non diversamente da ciò che già osserviamo con UTF-8 ).


Questo è solo il caso se i personaggi nella lingua aliena sono in realtà composti da un insieme più limitato di grafemi. Questo potrebbe non essere il caso.
Jacques B

1
Per quanto ne so, non è necessario che la combinazione di personaggi debba essere correlata a singoli grafemi. Le FAQ Unicode tacciono su questo, ma la mia impressione è che per un motore di layout non sarebbe più difficile supportare la combinazione di sequenze che non sono sequenze di grafemi, poiché in entrambi i casi sarebbe necessario un glifo precomposto.
Owen,

Per quanto tempo vivono questi alieni e quanti personaggi non scomponibili in grafemi possono imparare durante l'infanzia? E l'Hangul precomposto conserva il suo vantaggio di byte sull'Hangul decomposto anche dopo gzip?
Damian Yerrick,

-2

Modifica: la domanda ora dice "milioni di nuovi personaggi". Ciò semplifica la risposta:

No . Utf-8 è una codifica Unicode. Unicode ha uno spazio codici che consente 1.114.112 punti di codice distinti e meno di un milione è attualmente non assegnato. Quindi non è possibile supportare milioni di nuovi personaggi in Unicode. Per definizione nessuna codifica Unicode può supportare più caratteri di quanto definito da Unicode. (Ovviamente puoi imbrogliare codificando ulteriormente un livello - dopotutto ogni tipo di dati può essere rappresentato da solo due caratteri.)


Per rispondere alla domanda originale:

Unicode non supporta le lingue in quanto tali, supporta i caratteri - simboli utilizzati per rappresentare la lingua in forma scritta.

Non tutte le lingue umane hanno una rappresentazione scritta, quindi non tutte le lingue umane possono essere supportate da Unicode. Inoltre molti animali comunicano ma non hanno una lingua scritta. Le balene, ad esempio, hanno una forma di comunicazione che è abbastanza complessa da chiamare una lingua, ma non ha alcuna forma scritta (e non può essere catturata nemmeno dalla notazione fonetica esistente). Quindi, nemmeno tutte le lingue sulla terra possono essere supportate da Unicode.

Ancora peggio è qualcosa di simile al linguaggio delle api. Non solo non ha una forma scritta, non può essere significativamente rappresentato in forma scritta. La lingua è un tipo di danza che punta sostanzialmente in una direzione ma si basa sulla posizione attuale del sole. Pertanto la danza ha valore informativo solo nel luogo e nel momento in cui viene eseguita. Una rappresentazione simbolica o testuale dovrebbe includere informazioni (posizione, posizione del sole) che la lingua delle api non può attualmente esprimere.

Anche una forma di comunicazione scritta o simbolica potrebbe non essere possibile rappresentare in Unicode. Ad esempio, le illustrazioni o i fumetti senza parole non possono essere supportati da Unicode poiché l'insieme di glifi non è finito. Noterai molte comunicazioni pittoriche in contesti internazionali come un aeroporto, quindi non è inconcepibile che una razza di alieni che viaggiano nello spazio si sia evoluta per usare un linguaggio pittorico.

Anche se una razza aliena avesse una lingua con un sistema di scrittura con un insieme finito di simboli, questo sistema potrebbe non essere supportato in Unicode. Unicode prevede che la scrittura sia una sequenza lineare di simboli. La notazione musicale è un esempio di un sistema di scrittura che non può essere completamente rappresentato in Unicode, poiché il significato è codificato sia nella scelta dei simboli che nel posizionamento verticale e orizzontale. (Unicode supporta singoli simboli musicali, ma non può codificare una partitura.) Una razza aliena che comunicava usando musica polifonica (non insolita) o un canale di comunicazione di simile complessità, potrebbe benissimo avere un sistema di scrittura che assomiglia a una partitura orchestrale, e Unicode non può supportarlo.

Ma per amor di discussione supponiamo che tutte le lingue, anche le lingue aliene, possano essere espresse come una sequenza lineare di simboli selezionati da un insieme finito. Unicode è abbastanza grande per un'invasione aliena? Unicode ha attualmente meno di un milione di punti di codice non assegnati. La lingua cinese contiene centinaia di migliaia di caratteri secondo il dizionario cinese più completo (al momento non tutti sono supportati da Unicode come caratteri distinti). Quindi solo dieci lingue con la complessità del cinese consumerebbero tutto Unicode. Sulla terra abbiamo centinaia di sistemi di scrittura distinti, ma per fortuna la maggior parte sono alfabetici piuttosto che ideografici e quindi contengono un piccolo numero di caratteri. Se tutte le lingue scritte usassero ideogrammi come il cinese, Unicode non sarebbe nemmeno abbastanza grande per la terra. L'uso degli alfabeti deriva dal linguaggio che utilizza solo un numero limitato di fonemi, ma questo è particolare per la fisiologia umana. Quindi anche un singolo pianeta alieno con solo una dozzina di sistemi di scrittura ideografica potrebbe superare ciò che Unicode può supportare. Ora considera se questo alieno ha già invaso altri pianeti prima della Terra e incluso i loro sistemi di scrittura nell'insieme di personaggi che devono essere supportati.

L'espansione o la modifica delle codifiche correnti o l'introduzione di nuove codifiche non risolverà questo problema, poiché la limitazione è nel numero di punti di codice supportati da Unicode.

Quindi la risposta è molto probabilmente no.


5
Ti manca l'immaginazione. I coreografi della danza hanno un sacco di linguaggio e terminologia che possono usare per descrivere e insegnare le danze che gli attori del palcoscenico devono eseguire. Se dovessimo imparare ciò che le api stavano comunicando, potremmo sicuramente escogitare una terminologia scritta per questo. Dopotutto, la maggior parte delle nostre lingue scritte oggi sono una codifica del suono. Il movimento di codifica non è poi così diverso dalla codifica del suono.
whatsisname

3
Parti di questa risposta sono buone, ma dire "Non solo non ha una forma scritta, non può essere rappresentata in forma scritta" è semplicemente sbagliato. Tutto ciò che trasmette informazioni può essere ridotto a bit e qualsiasi cosa ridotta a bit può essere trasformata praticamente in qualsiasi flusso di caratteri che ti piace.
Gort il robot il

2
@StevenBurnap True, ma Unicode è più di una semplice sequenza di bit. È un modo di interpretare quei bit, che è abbastanza rigido. Sì, il set di caratteri Unicode potrebbe essere espanso per rappresentare qualsiasi cosa, dalle immagini alle istruzioni CNC, ma questa sarebbe una creatura molto diversa.
Owen,

4
Tieni presente che ciò che i simboli unicode descrivono (nella maggior parte delle lingue) sono schemi nella variazione della pressione dell'aria e che per la maggior parte delle lingue svolge effettivamente un lavoro abbastanza scadente di abbinare effettivamente tali schemi.
Gort il robot il

3
Quindi intendi la frase "vola 45 secondi con il sole 15 gradi a sinistra, quindi vola 10 secondi con il sole 10 gradi a destra" è impossibile? Richiede certamente la posizione del sole al momento come contesto.
Gort il robot il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.