Ritengo che la questione vada inquadrata nel modo giusto, più che caterve di link spesso scritti male o comunque pressochè inutili.
Prima cosa: carattere <> byte. E' proprio la primissima cosa da dimenticare.
Nasce per motivi storici, e troverete tutti i link del mondo su IBM, EBCDIC, ASCII etc.
Tutti pressochè inutili nel nostro caso.
Seconda cosa.
Cos'è unicode, e cosa non è.
Una funzione iniettiva e (teoricamente) biiettiva tra lettere (o glifi, o simboli) e code point.
Basta, niente di più.
Siccome è difficile definire cosa sia una lettera, non la si definisce, si suppone sia un concetto già definito, assiomatico (ovviamente, non lo è). Ma sono problemi dei linguisti.
Così come sono problemi dei linguisti i casi in cui le lettere cambino a seconda di dove si trovano (non tutte le lingue sono simili alla nostra), sempre problemi dei linguisti.
Abbiamo quindi le lettere (che non si sa bene cosa siano, ma vabbè), che formano quindi gli alfabeti.
Ad ognuna di esse è associato un numero esadecimale, il code point, specificato come U+X
Attenzione: per inciso non è detto che il code point sia limitato a lunghezza 4, quindi 64K
Terza cosa: non esistono i caratteri nei computer.
Elaborano solo numeri, bit e byte.
Come spero ormai sia chiaro una stringa unicode non è altro che una sequenza di code point, cioè... numeri interi.
Quarta cosa: la rappresentazione di unicode
Cioè la CODIFICA.
Esattamente come possiamo pensare ai code point come le "note" di una musica, esse possono materialmente essere conservate in vari modi, es. MP3, o wav.
Sono due codifiche diverse della stessa musica (tralasciamo per semplicità che MP3 è lossy).
Il punto è che ad una certa stringa Unicode, cioè ad una sequenza di lettere, posso associare TUTTE le codifiche che mi pare.
UTF-8, ASCII, sticazzi
Ottenendo sequenze di bit DIVERSE le quali rappresentano LA STESSA STRINGA.
Si pensi che so a una immagine BMP salvata in PNG (di nuovo tralasciamo compressione lossy etc, cribbio è un esempio didattico!).
L'immagine è la stessa, ma il file completamente diverso.
Quinta cosa: gli indiani piccoli e quelli grossi.
Come sa bene chi si occupa di assembly non è affatto detto che la medesima sequenza numerica (qualsiasi essa sia) venga memorizzata nello stesso identico modo da processori diversi, per la questione del little e big endian.
La dò per scontata, suppongo di non dover proprio fare anche uno schema di CPU.
Cosa significa? Significa che nel mondo "giusto" esiste una sequenza magica di caratteri che stabilisce se Unicode sarà codificato in little o big endian (255 e 254), quando si usano codifiche a lunghezza fissa, tipo UCS-2 (c'è anche quella a 4 byte, in teoria).
Chiaro? per me, sì.
Sesta cosa: utf
Bene, ora sappiamo cos'è e cosa non è unicode.
Ma come lo memorizziamo in concreto?
Visto che oggi ho da fare accenno solo a utf-8, perchè ho letto una caterva di minchiate, poi magari farò gli altri.
E' semplicemente una codifica a lunghezza variabile, da 1 a SEI (sei) byte.
Qualcuno mi dirà che ha letto 4, ma è questa la differenza tra chi utilizza in concreto quello che legge, e chi si limita a compulsare, ma vabbè.
Non è importante, è importante capire che è una sorta di "zippatore" di Unicode per una rappresentazione compatta.
La proprietà interessante è che per un sottoinsieme coincide con ASCII, ma qui davvero dovrei spiegare bene come funziona.
Oppure leggetevi uno dei tanti link.
Di nuovo: la cosa importante da ricordare è che si tratta di una codifica a lunghezza variabile (provate voi a fare --), quindi adatta essenzialmente per il ++
Settima cosa: la più importante.
Spero si inizi a capire che data una stringa (cioè una sequenza di byte, perchè i computer elaborano numeri, e non caratteri, remember?)
non conoscendone la codifica non si va da nessuna parte.
Esattamente come la sequenza binaria (uso esadecimale per comodità) AABB potrebbe essere i voti inglesi presi da un alunno (A, A, B, B), oppure un numero esadecimale, oppure la matricola del cibo per gatti.
Come faccio a capire cos'è?
Semplice, non posso farlo
Ottava cosa: esplicito e per tentativi.
Bene, come si fa allora a capire la codifica di una stringa, per poterla decodificare, se non possiamo dirlo dalla stringa stessa?
In due modi
(1) scrivendolo da qualche parte. E qui partirà (forse) il pippone su HTML/EML (Content-Type) e XML (sì, agenzia delle entrate, parlo delle tue fatture elettroniche dimmerda)
(2) per tentativi.
Ebbene sì, è normalissimo che i programmi (es. browser, esempio notepad++) provino "a casaccio" a capire se il testo è codificato ASCII, utf-8 o sticazzi.
Come? Provando le varie codifiche e cercando di capire, euristicamente, se il testo sembra avere un senso.
Ovviamente troverete 1000 esempi su internet di stringhe che in ASCII-italiano vogliono dire qualcosa, mentre in utf-8 felino tutt'altro, pur AVENDO LA STESSA RAPPRESENTAZIONE BINARIA.
Immaginate di avere un certo file su disco che, visualizzato come BMP, è un gatto, mentre interpretato come PNG è un cane.
E' quindi un gatto o un cane, che volevo rappresentare?
Spesso i programmi hanno proprio un comando del tipo "reinterpreta tutto come fosse utf-8 felino.
Vi eravate mai chiesti il perchè di questi elenchi?
Adesso (forse) lo sapete.
Nona: dentro e fuori.
Ecco perchè è normalissimo mantenere una rappresentazione INTERNA delle stringhe in un certo formato, spesso UCS-2 (che spero si capisca NON è unicode, è un MODO per rappresentare le stringhe unicode con 2 byte, col problema dei piccoli indiani).
Come Windows ad esempio (è il w).
Perchè lo si fa? Semplice, per il --
Comunque, ormai penso sia chiaro che DENTRO il programma posso mantenere il formato che mi pare, POI a un certo momento, in output, dovrò usare una certa codifica (ASCII, UTF, sticazzi).
Esattamente come il mio programma può mantenere in memoria un'immagine come gli pare ma poi, al salvataggio, dovrà conformarsi a uno standard ben preciso (es. JPG, es. PNG), la codifica
Decimo: un solo modo giusto (il mio, ovviamente), e tutti gli altri son sbagliati.
Penso si inizi a comprendere che se non si ragiona nel modo giusto (che è uno solo, quello sopra indicato), poi si fa confusione e saltano fuori le faccine.
Ma la possiamo mettrere in un'altro modo: non serve ragionare in termini di nessuna codifica fintanto che le codifiche di default non presentano problemi.
La situazione è diametralmente opposta.
Magari poi spiegherò le faccine e il ? di unicode, per ora tempo esaurito.
Fine pippone parte I
PS perdonate se non metto link, ma sono talmente banali che lo lascio per esercizio