Come determinare quanti caratteri Unicode può memorizzare
Unicode può memorizzare 1.111.998 caratteri.
Per sapere perché, dobbiamo guardare nella storia di Unicode e nelle definizioni tecniche di cosa è un carattere e cosa non lo è.
Nella fine degli anni '80, Unicode iniziò come una codifica a 16 bit per supportare tutte le lingue viventi del mondo, in contrasto con la già stabilita codifica ASCII a 8 bit che era solo quasi sufficiente per una o due lingue.
Per citare Unicode 88, di Joseph D. Becker,
Unicode è inteso ad affrontare il bisogno di una codifica di testo mondiale funzionante e affidabile. Unicode potrebbe essere approssimativamente descritto come "ASCII a corpo largo" che è stato allungato a 16 bit per includere i caratteri di tutte le lingue viventi del mondo. In un design ben progettato, 16 bit per carattere sono più che sufficienti per questo scopo.
A questo punto, Unicode era sia un indice di caratteri che uno schema di codifica - una codifica a due byte che fu poi chiamata UCS-2, quando emersero altre codifiche.
Come sappiamo oggi, 16 bit ([math]65.536[/math] valori) non erano sufficienti e lo standard Unicode ha già molti più caratteri assegnati, e ancora in crescita.
Fonte: Unicode e Rust, behnam/rust-unic.
Quando si espanse Unicode a metà degli anni '90, già molti sistemi avevano implementato UCS-2 ed era troppo tardi per cambiarli.
Fatto divertente #1: tali sistemi includono quasi tutti i linguaggi di programmazione popolari usati oggi: C++, Python, Java, Javascript, Ruby e PHP. (C# è venuto dopo, ma doveva rimanere vicino a Win32 e Java; un effetto a cascata.)
Pertanto, l'espansione è stata progettata per rimanere compatibile con i sistemi UCS-2, permettendo di usare porzioni di punti di codice Unicode per codificare valori più grandi di [math]65.535[/math]. Dopo aver considerato varie opzioni, il corpo dello standard Unicode è arrivato a quello che oggi conosciamo come lo schema di codifica chiamato UTF-16, l'Unicode Transformation Format a 16 bit.
Lo spazio di codice di UTF-16 può supportare punti di codice fino a : [17 × 2^{16} - 1 = 1.114.111[/math] (che è [math]10FFFF_{16}[/math]).
UTF-8 è stato inventato più tardi, con spazio per molti più caratteri di quelli permessi da UTF-16. Ma, poiché UTF-16 è parte integrante di molte tecnologie importanti, il Consorzio Unicode ha deciso di fissare la dimensione dello spazio di codice Unicode a ciò che è supportato da UTF-16, che è più piccolo della dimensione di UTF-8 e UTF-32.
Ma, aspetta! [math]17 × 2^{16} = 1.114.112[/math] non può essere la risposta finale, perché abbiamo dovuto sacrificare alcuni punti di codice in UCS-2 per essere in grado di codificare punti di codice fino al numero intero [math]1.114.111[/math]. Questi punti di codice sono chiamati Surrogate Pairs, divisi in due gruppi:
- High-Surrogate Code Unit, nel range U+D800 to U+DBFF ([math]2^{10} = 1024[/math] punti di codice), e
- Low-Surrogate Code Unit, nel range U+DC00 to U+DFFF (altri [math]2^{10} = 1024[/math] punti di codice).
Quindi, questi punti di codice non possono mai diventare un carattere reale. (Diciamo reale, perché i vecchi sistemi, come i file system in Windows e MacOS, li considerano come caratteri.)
Il nuovo spazio di codice che abbiamo dopo questa esclusione si chiama Unicode Scalar Value. La dimensione di questo spazio è: [math]17 × 2^{16} - 2 × 2^{10} = 1.112.064[/math].
Fatto divertente #2: Questo è dove si può vedere il beneficio dei linguaggi di programmazione moderni, come Rust e Swift, che fanno la loro definizione di carattere basata sui valori scalari Unicode.
A questo punto avremmo finito, solo se la domanda fosse la dimensione dei valori scalari. Ma tu hai chiesto "quanti caratteri" Unicode può memorizzare, quindi abbiamo ancora una piccola cosa da considerare.
Secondo la definizione di Unicode, ci sono alcuni punti di codice (o valori scalari) messi da parte per non essere mai assegnati come carattere. Questi punti di codice sono chiamati Noncharacter, ed esistono per essere usati internamente dal software, ma mai memorizzati o trasmessi come parte del testo.
Per citare il Glossario Unicode, un Noncharacter è:
Un punto di codice che è permanentemente riservato per uso interno. I Noncaratteri consistono nei valori U+nFFFE e U+nFFFF (dove n è da [math]0[/math] a [math]10_{16}[/math]), e i valori U+FDD0..U+FDEF.
Ci sono altri [math]66[/math] punti di codice che non possono mai diventare un carattere. Unicode ha stabilizzato il numero di non caratteri e questo insieme non cambierà mai.
Con questo, raggiungiamo la risposta finale, cioè: [math]17 × 2^{16} - 2 × 2^{10} - 66 = 1.111.998[/math].
Di questi [math]1.111.998[/math] punti di codice, alcuni sono messi da parte per uso privato. Questi punti di codice non saranno mai assegnati come carattere dal Consorzio Unicode. Ma, in conformità con lo standard Unicode, possono essere assegnati come "carattere Unicode" in un sistema con supporto completo per Unicode.
Per questo motivo, sto considerando i caratteri per Uso Privato inclusi nei numeri e smettiamo di fare sconti qui!
Articoli simili
- Come creare una password con 8 caratteri tra cui 1 lettera maiuscola, 1 carattere speciale e caratteri alfanumerici
- Cosa fa ISO 100, 200, 400, ecc. nelle fotocamere e nella fotografia e perché si chiama ISO e non RFC, IETF, IEEE, ANSI o Unicode?
- Quanti caratteri sono rappresentati su una tastiera QWERTY inglese statunitense?
- Come può l'IRS determinare che ho un reddito da locazione non dichiarato?