Informatica di base

I caratteri UNICODE nelle espressioni regolari

Autore

Manuel Ricci

Molti avranno sentito già parlare di UNICODE, ASCII e UTF-8, tutti questi termini sono legati da un unico filo. In questa lezione vediamo di ripercorrere la storia di UNICODE e dove siamo oggi.

La storia di UNICODE

Il nome UNICODE deriva dai suoi tre principali obiettivi:

  1. Universale: per rispondere alle esigenze delle lingue di tutto il mondo
  2. Uniforme: lunghezza fissa per un accesso efficiente
  3. Unico: la sequenza di bit è interpretabile in una sola maniera

La prima volta che si inizia a parlare di UNICODE, probabilmente ancora non con questo nome, è nel 1987, in seguito ad una discussione tra ingegneri Apple e Xerox: Joe Becker, Lee Collins e Mark Davis.

Nell’anno successivo a questo confronto, i tre indagarono a fondo sull’entità del progetto. Quali potevano essere le difficoltà, come usare due byte per poter rappresentare i caratteri e quantificare i caratteri da catalogare.

Nel 1988, Collins si mise al lavoro sulla costruzione del primo database UNICODE. L’anno successivo, nel 1989, si uniscono al progetto alcuni ingegneri della Sun Microsystem (acquistata da Oracle nel 2010 è stata la produttrice del linguaggio Java). Nel 1990 al team si uniscono anche IBM e Microsoft e sempre nello stesso anno viene distribuita la prima bozza e siccome si volevano raccogliere quanti più feedback possibili, Microsoft si fece carico dei costi di distribuzione, mentre NeXT Computer (quella fondata da Steve Jobs nel 1985 quando venne allontanato da Apple e acquistata da quest’ultima nel 1997) si mise al lavoro sul database per incorporare le future versioni dello standard.

Il 3 gennaio 1991 la Unicode Inc. viene incorporata nello stato della California e oggi la conosciamo come UNICODE Consortium.

I membri originali del board direttivo erano:

  • Larry Tesler, Apple Computer, Inc.
  • Robert Carr, GO Corporation
  • Richard Holleman, IBM Corporation
  • Charles Irby, Metaphor Computer Systems
  • Paul Maritz, Microsoft Corporation
  • Bud Tribble, NeXT Computer Inc.
  • Jay Israel, Novell, Inc.
  • David Richards, The Research Libraries Group.
  • John Gage, Sun Microsystems Inc.

Il primo dell’elenco, Larry Tesler, è lo stesso che ha inventato il copia e incolla e della legge di Tesler, nota anche come legge di conservazione della complessità, afferma che per ogni sistema esiste una certa quantità di complessità che non può essere ridotta.

Per una storia più ricca di UNICODE potete consultare la cronologia sul sito del consorzio.

Cos’è UNICODE

Chiusa la parentesi storica, cerchiamo di rispondere alla domanda: cos’è UNICODE?

UNICODE sta per Universal Character Set ed è uno schema di codifica i cui standard sono mantenuti dall’UNICODE Consortium.

Il più grande vantaggio di UNICODE è che possiamo definire in modo univoco ogni carattere in ogni lingua assegnando un numero diverso.

Attualmente lo standard è alla versione 15.0 e conta 149.186 caratteri. Per fare un confronto, la versione 1.0 ne contava circa 60.0000.

Concetto super importante legato a UNICODE è l’encoding. UNICODE stabilisce l’elenco dei grafemi (i caratteri), ma la vera e propria rappresentazione è stabilita dall’encoding.

ASCII è il più noto tra gli encoding. Per noi occidentali è altrettanto noto un altro encoding, UTF-8. Quest’ultimo è un tipo di encoding compatibile con ASCII, a differenza di UTF-16 che non lo è.

Per immaginare ancora meglio la relazione tra UNICODE e ASCII dovete immaginarli un po’ come TypeScript e JavaScript. UNICODE è un superset di ASCII.

Venendo alle espressioni regolari

Le due entità \u e \U non sono disponibili in moltissimi engine di regular expression. La loro funzione è quella di permetterci di individuare ogni carattere, usando il codice UNICODE.

La differenza in questo caso non sta nel fatto che il maiuscolo è il contrario del minuscolo (come visto per altre entità), ma nella forma del codice che possiamo usare.

1\u0041 (UTF-8)
2\U00000041 (UTF-32)

Carattere ASCII

A differenza di \u e \U, \x è supportato dai vari engine e può essere utilizzato per individuare i caratteri.

1\xc0 corrisponde a À
2\x41 corrisponde ad A
3\xa6 corrisponde a |
4\x40 corrisponde a @

Il codice da far seguire alla x lo si può trovare qui. Una cosa buffa è che alcuni caratteri, per quanto vengano codificati diversamente in UNICODE (giustamente) sono rappresentati dai vari sistemi di encoding con glifi identici. Questo è il caso della punto e virgola e ; e il punto di domanda greco ;. Sono rappresentati in modo identico, ma se messi su regex101 vedremo che \x3B non selezionerà entrambi, gli apparenti punti e virgola, ma solo uno.

Idea per uno scherzo: sostituire tutti i punti e virgola nel codice di un amico/collega con un punto di domanda greco. Ci sarà da ridere.

Per un elenco ancora più esaustivo potete andare anche su compart.com.

Conclusioni

Con questa lezione più storica che altro abbiamo visto l’origine di UNICODE e le entità che possiamo usare per identificare univocamente uno specifico carattere. Nella prossima lezione vedremo i lookup, la possibilità di guardarci intorno nelle espressioni regolari.

Caricamento...

Diventiamo amici di penna? ✒️

Iscriviti alla newsletter per ricevere una mail ogni paio di settimane con le ultime novità, gli ultimi approfondimenti e gli ultimi corsi gratuiti puubblicati. Ogni tanto potrei scrivere qualcosa di commerciale, ma solo se mi autorizzi, altrimenti non ti disturberò oltre.

Se non ti piace la newsletter ti ricordo la community su Discord, dove puoi chiedere aiuto, fare domande e condividere le tue esperienze (ma soprattutto scambiare due meme con me). Ti aspetto!

Ho in previsione di mandarti una newsletter ogni due settimane e una commerciale quando capita.