CodeGym /Corsi /C# SELF /Come specificare la codifica durante lettura e scrittura ...

Come specificare la codifica durante lettura e scrittura ( Encoding)

C# SELF
Livello 37 , Lezione 2
Disponibile

1. Codifica di default

Quando lavori con StreamReader o StreamWriter, usano la codifica di default.

Se scrivi:

using var reader = new StreamReader("myfile.txt");

o

using var writer = new StreamWriter("output.txt");

.NET sceglie la codifica di default. Su Windows generalmente è UTF-8 (spesso senza BOM), ma in applicazioni vecchie o su altri sistemi il comportamento può essere diverso.

Nella maggior parte dei casi UTF-8 è una buona scelta: supporta tutte le lingue e conserva il testo inglese in modo compatto (e anche il russo ci sta abbastanza bene). Però se il file è stato creato in un'altra codifica (per esempio Windows-1251), o se lo leggeranno altri programmi che si aspettano una codifica specifica, è necessario specificare esplicitamente quella corretta.

2. Specificare la codifica per StreamReader e StreamWriter

Varianti dei costruttori

Sia StreamReader che StreamWriter supportano costruttori in cui puoi passare un oggetto di tipo System.Text.Encoding.

Esempio:

using var reader = new StreamReader("myfile.txt", Encoding.UTF8);
using var writer = new StreamWriter("output.txt", false, Encoding.UTF8);

Se vuoi lavorare con ASCII, Windows-1251 o UTF-16, basta mettere un'altra codifica:

using var reader = new StreamReader("myfile.txt", Encoding.Unicode); // UTF-16
using var reader2 = new StreamReader("rus.txt", Encoding.GetEncoding("windows-1251"));

Tabella rapida delle codifiche più diffuse:

Codifica Espressione C# Descrizione
UTF-8
Encoding.UTF8
Supporta tutte le lingue, compatto
UTF-16 (Unicode)
Encoding.Unicode
Standard .NET, 2 byte per carattere
ASCII
Encoding.ASCII
Solo i caratteri base (inglese)
Windows-1251
Encoding.GetEncoding("windows-1251")
Russo, vecchie applicazioni Windows

Attenzione! Per codifiche non standard come Windows-1251 usa il metodo Encoding.GetEncoding("windows-1251").

3. Leggere e scrivere con codifica esplicita

Aggiungiamo al nostro piccolo progetto una nuova funzionalità: che legga un file con la codifica indicata e scriva il risultato in un nuovo file, anch'esso con codifica esplicita. Così puoi, per esempio, convertire testi tra sistemi diversi!

Esempio 1: Leggere un file in Windows-1251 e stamparlo a schermo

// Supponiamo che il file sia stato creato con la vecchia Windows-1251
using var reader = new StreamReader("ru_text.txt", Encoding.GetEncoding("windows-1251"));

string line;
while ((line = reader.ReadLine()) != null)
{
    Console.WriteLine(line);
}

Perché è importante: Se non avessimo specificato la codifica, al posto delle lettere russe avremmo ottenuto caratteri orribili tipo "Учебник".

Esempio 2: Scrivere un file in UTF-16 (Unicode)

using var writer = new StreamWriter("utf16text.txt", false, Encoding.Unicode);
writer.WriteLine("Ciao, mondo!");
writer.WriteLine("Hello, world!");
writer.WriteLine("こんにちは世界");

Risultato: Aprendo il file, per esempio in Notepad, vedrai che tutti i caratteri vengono mostrati correttamente.

4. Piccola utility per convertire codifiche

Esercizio (spesso richiesto nei colloqui!): Convertire un file di testo dalla codifica Windows-1251 a UTF-8.

string sourcePath = "ru_text_1251.txt";
string destPath = "ru_text_utf8.txt";

// Leggiamo con la codifica Windows-1251
using var reader = new StreamReader(sourcePath, Encoding.GetEncoding("windows-1251"));
// Scriviamo in UTF-8
using var writer = new StreamWriter(destPath, false, Encoding.UTF8);

string? line;
while ((line = reader.ReadLine()) != null)
    writer.WriteLine(line);

Ora ru_text_utf8.txt si può aprire tranquillamente in VSCode, Linux, Mac e vedere il testo leggibile.

5. Dettagli utili

Come capire in quale codifica è un file?

È una domanda insidiosa! Di solito il file non contiene informazioni sulla sua codifica (a parte i file con BOM, di cui parleremo nella prossima lezione). Se apri un file con la codifica sbagliata, vedi caratteri illeggibili.

Approcci pratici comuni:

  • Se il file è stato creato dal tuo programma — usa sempre la stessa codifica per leggere che hai usato per scrivere.
  • Se il file viene da una fonte sconosciuta — prova diverse codifiche o usa strumenti di terze parti per identificarla.

Lavorare con emoji e caratteri strani

UTF-8 e UTF-16 permettono di usare liberamente emoji e simboli da lingue diverse. Prova a salvare un file con emoji in UTF-8 e poi aprirlo con una codifica vecchia — sarà divertente (o forse no)!

Codice con emoji:

using var writer = new StreamWriter("emoji.txt", false, Encoding.UTF8);
writer.WriteLine("Ciao 👋😀🌍");

StreamReader con rilevamento automatico della codifica

Il costruttore di StreamReader ha un overload con il parametro detectEncodingFromByteOrderMarks:

new StreamReader(path, encoding, detectEncodingFromByteOrderMarks: true)

Se questo parametro è true (valore di default!), StreamReader proverà a indovinare la codifica dal fatto che il file contiene un BOM (una specie di "marca" all'inizio del file). Ma se il file è stato creato senza BOM o in una codifica esotica, il rilevamento non funzionerà.

Quando e perché specificare esplicitamente la codifica?

  • Dati multilingue: supportare arabo, cinese, emoji ecc.
  • Integrazioni: il file viene letto/scritto non solo dalla tua app, ma anche da sistemi esterni che si aspettano una codifica specifica.
  • La dimensione del file conta: ASCII/UTF-8 è più efficiente per il latino, UTF-16 può essere più conveniente per gli ideogrammi.
  • Compatibilità: log/export per altre applicazioni.

6. Errori tipici lavorando con le codifiche

Errore n.1: non specificare la codifica quando si legge un file.
Leggere un file con testo russo (o altri non-latini) senza indicare la codifica spesso porta a testo illeggibile.

Errore n.2: mismatch tra codifica di scrittura e di lettura.
Il file è stato scritto con una codifica e aperto con un'altra — il risultato è testo corrotto. Succede spesso quando si spostano file tra OS o programmi diversi.

Errore n.3: codifiche non supportate o parzialmente supportate.
Alcuni editor non gestiscono bene UTF-8 senza BOM o vecchie codifiche mono-byte come Windows-1251. A volte bisogna cambiare la codifica manualmente e fare tentativi.

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION