Quale limitazione dovremo affrontare se ogni carattere percepito dall'utente è assegnato a un punto di codice?

5

Quali limitazioni avremo se gli standard Unicode avessero deciso di assegnare uno e un solo codepoint a ogni personaggio percepito dall'utente?

Attualmente, Unicode ha punti di codice che corrispondono alla combinazione di caratteri. Questi personaggi si combinano con un precedente punto di codice (o una sua sequenza) per presentare all'utente ciò che sembra essere un singolo carattere.

Da quello che vedo, lo standard attuale è pieno di complessità. (Siamo non parlando di problema di codifica qui. Anche se cerchiamo di evitare qualsiasi tipo di complessità utilizzando una codifica come UTF-32, il problema persiste .)

Ad esempio, in Unicode quando un grafo grapheme è rappresentato internamente da una sequenza di caratteri composta da carattere base + accento, quindi quando l'utente fa clic sul pulsante > per saltare al prossimo percepito dall'utente carattere, abbiamo dovuto saltare dall'inizio del personaggio base alla fine dell'ultimo carattere del cluster.

Perché deve essere così difficile? Perché Unicode non può assegnare un singolo punto di codice a ogni personaggio percepito dall'utente, per cui andare al personaggio percepito dall'utente è semplicemente questione di leggere il prossimo punto di codice?

Il sito web unicode sembra riconoscere questa complessità:

In those relatively rare [not rare at all!] circumstances where programmers need to supply end users with user-perceived character counts, the counts should correspond to the number of segments delimited by grapheme clusters. Grapheme clusters may also be used in searching and matching

I diacritici sono anche la ragione per cui le cose non funzionano come previsto. Per esempio, se lancio 2 caratteri ((giapponese katakana PI usando la rappresentazione unicode U+30d2 U+309a ) in un Builder di stringhe e rovesciarlo, mi aspetterei naturalmente che l'output fosse di 2 ピ caratteri (cioè ピ ピ), ma fornisce un output non valido di ゚ ピ ヒ!

Se Unicode avesse assegnato singoli punti di codice per ciascun personaggio percepito dall'utente e scartato l'idea dei grapheme cluster, ciò non sarebbe accaduto affatto.

Quello che vorrei sapere è, cosa c'è di sbagliato nel rappresentare ogni personaggio percepito dall'utente come un codice unicode? È probabile che così facendo si supererebbero U + 10FFFF possibili punti di codice (se supera i punti di codice U + 10FFFF non vedo alcun motivo per cui non avrebbero potuto impostare il limite a 2 ^ 32 in primo luogo), anche quando c'è così tanto spazio libero da includere l'intera famiglia di Elf Languages ?

Stati Unicode :

If you wanted, for example, to give each “instance of a character on paper throughout history” its own code, you might need trillions or quadrillions of such codes;

Ma sul serio non ha alcun senso. Dov'è la fonte per fare un simile reclamo? Un trilione di codici è piuttosto una dichiarazione eccessiva.

    
posta Pacerier 09.12.2011 - 00:10
fonte

3 risposte

4

Le origini di Unicode risalgono al 1987-1988, quando Joseph D. Becker ha pubblicato la prima bozza di proposta Unicode . Una codifica a larghezza fissa a 16 bit (UCS-2) era una parte indispensabile del suo progetto. Era molto orgoglioso della distinzione che aveva fatto tra personaggi e glifi, giusto per spremere tutto in questa piccola gamma. Sfortunatamente le sue supposizioni ingenue si sono dimostrate sbagliate, o almeno irrealistiche, quando nel 1996 il code-space Unicode è stato aumentato oltre il limite di 16 bit e UCS-2 è stato esteso a UTF-16. Attualmente Unicode ha quasi il doppio dei codepoint allocati rispetto allo spazio codice del design originale di Becker.

[...] if it does exceed U+10FFFF code points I see no reason why they couldn't have set the limit to 2^32 in the first place [...]

Attualmente è limitato da U + 10FFFF perché è il range massimo che può essere codificato con UTF-16. UTF-16 è un brutto attacco applicato a fine giornata per estendere lo spazio del codice. Non è estensibile. UTF-8 d'altra parte è. All'inizio UTF-8 è stato permesso di codificare 2 31 codepoint e in seguito è stato limitato a corrispondere semplicemente allo stesso intervallo di UTF-16. In effetti è possibile estendere lo schema utilizzato da UTF-8 a tempo indeterminato, anche per codificare 2 codecoint 128 e preservare tutte le buone proprietà di UTF-8 allo stesso tempo (sottostringa lessicograficamente comparabile, non ambigua che corrisponde a UTF -8 codice inconsapevole, ecc.) Tranne per il fatto che non sarà possibile determinare la lunghezza del punto di codice dal primo byte.

From what I can see, the current standard is full of complexities. Even if I try to avoid any kind of complexities by using an encoding like UTF-32, this problem still persists. It's not an encoding issue at all.

Esattamente! Voglio sottolineare che le codifiche di lunghezza variabile non sono il problema . In effetti, trovare il prossimo punto di codice in una stringa UTF-8 è semplice, basta cercare il byte successivo della forma 0xxxxxxx o 11xxxxxx . Quindi potremmo facilmente aumentare il codice disponibile senza aumentare il consumo medio di memoria. Il problema reale è che per trovare il prossimo grafo è necessario avere un database Unicode disponibile (in qualche modo), che è sicuramente complesso e costoso per molte semplici applicazioni.

    
risposta data 31.12.2011 - 21:17
fonte
3

Se uno script ha M lettere e N diacritici, allora una rappresentazione precomposta richiede fino a M*N code point, mentre una rappresentazione decomposta richiede solo M+N . La combinazione di caratteri impedisce Unicode di "esaurire i punti di codice".

    
risposta data 09.12.2011 - 01:52
fonte
2

è perché nei tempi passati un'unità di dati era di 8 bit, l'architettura a 32 bit diffusa è più giovane del vecchio standard ASCII su cui si basano le varianti UTF (per compatibilità all'indietro)

oltre ai programmatori su quelle vecchie ( sizeof(int)== 16 bits ) le architetture non sono mai piaciute usando più risorse del necessario (la memoria in particolare ricorda che UTF32 richiede 4 volte tanta memoria di UTF8 per il testo solo nell'alfabeto latino ) come nel resto della giornata hai solo poche centinaia di kilobyte a tua disposizione nel migliore dei casi

e non hai bisogno di altri caratteri oltre a quelli in ASCII se stai programmando solo per l'inglese (o qualsiasi lingua senza accenti)

una grande lezione che puoi imparare qui è: tutto ciò che cresce rispetto ai mutevoli requisiti è raramente una prova futura contro il prossimo cambio di requisiti e generalmente solo abbastanza buono per i requisiti attuali e se qualcuno pensa a una soluzione che superi i requisiti sarà probabilmente vengono abbattuti per vari motivi (i più comuni saranno le prestazioni, l'uso della memoria e la compatibilità)

permettimi anche di indirizzarti verso questo fumetto xkcd che potrebbe far luce sulla situazione

    
risposta data 09.12.2011 - 00:37
fonte

Leggi altre domande sui tag