Allora vediamo... tu me lo avevi già spiegato, in occasione di questa discussione.
Molto bene.
Quindi da quanto qui spieghi il carattere (speciale) ASCII esteso può essere rappresentato da due caratteri ASCII consecutivi.
...
è rappresentato da due caratteri consecutivi.
Però non sono riuscito a estrarre il doppio carattere ASCII dalla stringa “é”.
"
O San Midi musico ed anacoreta,
guida tu il mio cammino:
io m'affido solo a te.
Io m'affido solo a te ! "
Possiamo utilizzare almeno 4 modalità per vedere via codice i valori costituenti i caratteri non-ASCII !
1
a modalità
Quando noi lavoriamo con i caratteri, utilizziamo memoria, nella quale essi vengono immagazzinati. Pertanto, è là... in qualche spelonca della memoria del calcolatore che vanno rintracciati e stanati.
Quale risorsa di Gambas ci consente di sondare i profondi e misteriosi recessi della memoria ?
...i
Memory Stream .
Vediamo come procediamo:
Public Sub Main()
' Immagazziniamo i valori che compongono la lettera "è" nella memoria
' mediante il suo assegnamento in una coerente variabile di tipo Stringa:
Dim s As String = "è"
' Sappiamo che per operare con i "Memory Stream" dobbiamo avere una variabile
' di tipo Puntatore, nella quale leggere (o scrivere) appunto con gli "Stream":
Dim p As Pointer
Dim st As Stream
Dim b1, b2 As Byte
' Generiamo una variabile di tipo Puntatore che punta all'indirizzo di memoria della variabile
' di tipo Stringa contenente il valore "è":
p = VarPtr(s)
' Generiamo dal Puntatore una variabile di tipo "Stream", con la quale - come già detto -
' potremo leggere nell'area di memoria puntata dal Puntatore:
st = Memory p For Read
' Leggiamo il 1° byte dell'area di memoria puntata dal Puntatore e la mostriamo in console:
Read #st, b1
Print Hex(b1),
' Leggiamo il 2° byte dell'area di memoria puntata dal Puntatore e la mostriamo in console:
Read #st, b2
Print Hex(b2)
' Chiudiamo il flusso di memoria:
st.Close
' Per mera controprova scriviamo in console il combinato risultato delle due letture:
Print Chr(b1); Chr(b2)
End
In console vedremo i valori (C3 - A8) delle due variabili di tipo Byte combacianti perfettamente con i valori riportati dalla mia precedente spiegazione che tu hai ritrovato.
La controprova ci restituisce in console nuovamente e coerentemente la lettera: " è "
2
a modalità
Senza dover scomodare San Midi, né i flussi di memoria, possiamo ottenere più semplicemente il medesimo risultato con i Vettori di tipo
Byte[ ]:
Public Sub Main()
Dim s As String = "è"
Dim bb As Byte[]
' Carichiamo in un Vettore di tipo "Byte[]" tutti i valori che compongono
' e rappresentano il carattere contenuto nella variabile di tipo "String":
bb = Byte[].FromString(s)
' Quindi li vediamo nella console:
Print Hex(bb[0]), Hex(bb[1])
' Procediamo alla controprova:
Print Chr(bb[0]); Chr(bb[1])
End
3
a modalità
Possiamo anche semplicemente utilizzare qualche funzione per le Stringhe:
Public Sub Main()
Dim s As String = "è"
Print Hex(Asc(Mid("è", 1, 1))), Hex(Asc(Mid("è", 2, 1)))
' Solita controprova:
Print Chr(Asc(Mid("è", 1, 1))); Chr(Asc(Mid("è", 2, 1)))
End
4
a modalità
La quarta modalità è la più breve, anche se restituisce un risultato più
sporco, da ripulire quindi ed interpretare.
Public Sub Main()
Dim s As String = "è"
' Utilizziamo la funzione di dereferenziazione di un "Puntatore a Puntatore" in modo del tutto inusuale:
' inserendo come suo argomento la variabile Stringa contenente la lettera localizzata.
' Ciò nella considerazione che la variabile Stringa punta essa stessa ad un'area di memoria:
Print Pointer@(s)
End
Il risultato è costituito dall'indirizzo di memoria della stringa di valori ed alla fine, a destra, dai valori che cerchiamo. In questo caso, come si nota, i valori costituenti la lettera "è" sono posti in un ordine inverso, ossia così:
a8c3Sapendo così interpretare quel risultato, siamo in grado comunque di conoscere i due valori che cercavamo.