Cosa c'e' di più semplice di salvare una stringa di caratteri su un file di testo? Usiamo uno StreamWriter, richiamiamo il metodo Write passandogli la stringa. Fine.
Effettivamente così funziona. Ma iniziamo ad inserire qualche vincolo in più. Supponiamo che la stringa di input sia una stringa ASCII generata casualmente e il codice dei caratteri ASCII presenti vada da 0 a 255 (quindi viene utilizzata anche la tabella estesa). Supponiamo inoltre che il file debba avere una lunghezza prefissata, pari al numero di caratteri della stringa di input. Infine supponiamo che questo file debba essere elaborato da un vecchio programma che non può essere modificato.
Se passiamo il file generato dallo StreamWriter precedente otterremo un errore. Andando a spulciare la documentazione si può notare che l'oggetto StreamWriter utilizza come codifica predefinita l'UTF-8, che nel caso specifico non viene interpretata corettattamente dal vecchio programma.
L'oggetto StreamWriter mette a disposizione anche una serie overload, in cui è possibile specificare, anche la codifica da utilizzare. Possiamo quindi specificare la codifica ASCII e il gioco è fatto. Il codice seguente mostra un esempio di utilizzo:
Public Sub WriteASCIIFile(ByVal fileName As String, ByVal content As String)
Using sw As StreamWriter = New StreamWriter(fileName, False, Encoding.ASCII)
sw.Write(content)
sw.Close()
End Using
End Sub
Andando a verificare il file ottenuto, la dimensione è quella corretta e tutto sembra a posto. In realtà andando a guardare bene i lfile ottento, tutti i caratteri della tabella ASCII estesa sono stati sostituiti con dei punti interrogativi. Questo perchè la codifica ASCII utilizza 7 bit e quindi gestisce solo i caratteri con codici che vanno da 0 a 127.
La soluzione è quella di utilizzare l'encoding di default, che recupera la tabella dei codici ANSI definita nelle impostazioni internazionali, oppure utilizzare il metodo System.Text.Enconding.GetEncoding per recuperare una tabella di codici di decodifica specifica (l'elenco di tutte le codifiche disponibili nel sistema si ottiene chiamando il metodo System.Text.Enconding.GetEncodings).
Il codice precedente diventa quindi:
Public Sub WriteASCIIFile(ByVal fileName As String, ByVal content As String)
Using sw As StreamWriter = New StreamWriter(fileName, False, Encoding.Default)
sw.Write(content)
sw.Close()
End Using
End Sub