Allora vediamo... tu me lo avevi già spiegato, in occasione di questa discussione (http://www.gambas-it.org/smf/index.php?topic=3312.msg32384#msg32384).
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 (http://it.wikipedia.org/wiki/Musical_Instrument_Digital_Interface) 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 !
1a 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 . ;D
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: " è "
2a modalità
Senza dover scomodare San Midi, né i flussi di memoria, possiamo ottenere più semplicemente il medesimo risultato con i Vettori di tipo Byte[ ]: :D
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
3a 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
4a 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ì: a8c3
Sapendo così interpretare quel risultato, siamo in grado comunque di conoscere i due valori che cercavamo. ;D
L'ultimo tuo esempio potrebbe essere completato così?
Dim s, a, b As String
s = "è"
' Dereferenziamo la variabile Stringa in modo del tutto inusuale: mediante la funzione di Gambas utilizzata solitamente
' per dereferenziare un Puntatore a Puntatore. Ciò nella considerazione che la variabile Stringa punta essa stessa ad un'area di memoria:
a = Pointer@(s)
s = Right$(a, 4)
a = Mid$(s, 3)
b = Left$(s, 2)
Print a, b
' solita controprova
Print Chr(Val("&" & a)); Chr(Val("&" & b))
:ciao: