2012-03-06 19 views
6

Sto cercando di fare qualcosa che penso debba essere abbastanza semplice, ma ho già passato troppo tempo e ho provato diversi approcci diversi che ho cercato ma senza risultati.C# UTF8 Lettura/emissione

Fondamentalmente, ho una lunga lista di nomi con caratteri "speciali" dal set di caratteri UTF8.

Il mio obiettivo finale è quello di leggere ciascun nome e quindi effettuare una richiesta HTTP utilizzando tale nome nell'URL come variabile GET.

Il mio primo obiettivo era quello di leggere un nome da un file e metterlo sullo standard per confermare che potevo leggere e scrivere correttamente in UTF8, prima di creare le stringhe e fare tutte le richieste HTTP.

Il file test1.txt ho fatto contenevano proprio questo contenuto:

ownage

Ho quindi utilizzato il codice C# per leggere nel file. Ho impostato la codifica StreamReader e Console.OutputEncoding in UTF8.

static void Main(string[] args) 
{ 
    Console.OutputEncoding = System.Text.Encoding.UTF8; 

    using (StreamReader reader = new StreamReader("test1.txt",System.Text.Encoding.UTF8)) 
    { 
     string line; 

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

    } 

    Console.ReadLine(); 
} 

Con mia grande sorpresa ho questo tipo di uscita:

enter image description here

risultato atteso è la stessa esatta come il contenuto del file originale.

Come posso essere certo che le stringhe che sto per compilare per rendere le richieste HTTP saranno corrette se non riesco a fare un semplice compito come leggere/scrivere stringhe UTF8?

risposta

6

programma in bene (assumendo che il file di input è in realtà UTF-8). Se esegui il debug del tuo programma e utilizzi la finestra Watch per osservare le stringhe (la variabile line), troverai che è corretta. Che è come si può essere certi che invierai richieste HTTP corrette (o qualsiasi altra cosa tu faccia con le stringhe).

Quello che stai vedendo è un bug nella console di Windows.

Fortunatamente, ha effetto solo sui caratteri raster. Se si modifica la finestra della console per utilizzare un carattere TrueType, ad es. Consolas o Lucida Console, il problema scompare.

screenshot

È possibile impostare questo per tutte le finestre future utilizzando il “Defaults” voce di menu:

screenshot

+1

+1 Questo è corretto. Assicurati inoltre di salvare il file di esempio utilizzando UTF-8 e non ANSI, che è l'impostazione predefinita nel Blocco note. – Yuck

+0

Questo, unitamente al suggerimento di Yuck, per assicurarsi di aver selezionato UTF-8 invece di ANSI quando ho salvato il file. Grazie ragazzi mi hai risparmiato un sacco di mal di testa, ne sono sicuro! – user17753

3

Vedi Reading unicode from console

Se stai usando .NET 4 è necessario utilizzare

Console.InputEncoding = Encoding.Unicode; 
    Console.OutputEncoding = Encoding.Unicode; 

e garantire stai usando Lucida Console come il font della console.

Se si utilizza .NET 3.5, probabilmente si è sfortunati.

Per leggere in modo efficiente le linee da un file avrei probabilmente usare:

foreach(var line in File.ReadAllLines(path, Encoding.UTF8)) 
{ 
    // do stuff 
} 
+0

Ciò provoca un errore 'IOException' quando lo provo. – Yuck

+0

Qual è il messaggio nell'eccezione? – Phil

+0

* Il parametro non è corretto. * E 'sulla prima riga 'Console.InputEncoding = Encoding.Unicode;'. Anche usando .NET 4. – Yuck

1

Per leggere tutti i personaggi come te menzioni è necessario utilizzare la codifica di default come questo

new StreamReader(@"E:\database.txt", System.Text.Encoding.Default))