6

Il mio codice:errore stringa di codifica (Windows 10 + di Visual Studio 2015 Net + 4.6)

Keys = new Dictionary<string, string>(); 
Keys.Add("Набег_0", "raid_0"); 

Quando mi Keys.ElementAt(0), ho questo: {[Íàáåã_0, raid_0]}. Naturalmente, quando si esegue il programma, key = "Набег_0" non è definito e il programma si blocca con un System.Collections.Generic.KeyNotFoundException

Questo codice funzionato bene quando ho avuto di Windows 8.1 + Visual Studio 2013 + net 3.5

come posso risolvere questo ?

+0

Suona come se avessi sempre il bug. In qualche modo la chiave Íàáåã_0 è all'elemento zero invece di Ha6er_0. – jdweng

+0

Le chiavi sono scritte in russo. L'obiettivo è quello di ottenere il significato inglese. Prima di eseguire l'aggiornamento a Windows 10 + .Net 4.6 e il codice di Visual Studio 2015 funzionava perfettamente. Si vede chiaramente che il nuovo studio visivo non comprende più la lingua russa. Può dare la colpa a windows o .net. Non vorrei cambiare tutti i loro manuali in inglese, dal momento che richiederebbe molte modifiche al programma. P. S. mi dispiace per la traduzione automatica – lantsev1981

+1

È la codifica. Sembra che tu abbia caratteri Unicode. Classe stream predefinita per la codifica ascii. Sembra che tu debba specificare la codifica Unicode in una delle tue classi. – jdweng

risposta

6

In qualche modo hai convinto il compilatore C# che il tuo codice sorgente è stato scritto nella code page 1251, la code page di sistema predefinita in Europa orientale e Russia. Di solito è causato dal file di testo che manca la BOM utf-8. Non è chiaro come sia successo, forse hai creato il file con un editor di testo diverso da quello incorporato in Visual Studio. Forse è stato alterato dal controllo del codice sorgente, quelli con uno sfondo Unix tendono a far cadere il BOM.

Aprire il file di origine in Visual Studio e assicurarsi che continui a leggere correttamente. Quindi utilizzare File> Salva come, fare clic sulla freccia sul pulsante Salva, selezionare "con codifica" e selezionare "Unicode (UTF-8 con firma)".

Assicurarsi inoltre che il valore predefinito sia ancora valido. File> Opzioni di salvataggio avanzate> cambia la codifica se necessario. Se usi abitualmente un altro editor di testo, dovrai configurarlo in modo da salvare i file con una distinta base.

+0

Il salvataggio dei file in UTF-8 è stato di aiuto, ma non è ancora chiaro come sia successo che tutti i miei file fossero in ANSI. Forse da incolpare per TFS. Ora devo sfogliare tutti i file per la presenza della codifica UTF-8 e il progetto ... Grazie mille per il vostro aiuto! – lantsev1981

+0

Ha funzionato perfettamente prima di Visual Studio 2015 anche con i file nella codepage 1251. Sembra essere un bug in Visual Studio come è stato menzionato nella prossima risposta. – tyger

5

Ho lo stesso problema, nel mio caso era ReSharper che ha salvato i miei file in windows-1251 dopo aver applicato il refactoring "move class to separate file".

Ho usato questo test per convertire tutti i miei file cs in repo in UTF-8.

[Test] 
    public void UpdateEncoding() 
    { 
     string path = @"C:\dev\Cash\src"; 
     foreach (var file in Directory.GetFiles(path, "*.cs", SearchOption.AllDirectories)) 
     { 
      if (HasBom(file)) 
       continue; 

      Console.WriteLine(file); 

      var content = File.ReadAllText(file, Encoding.GetEncoding("windows-1251")); 
      File.WriteAllText(file, content, Encoding.UTF8); 
     } 
    } 

    private bool HasBom(string file) 
    { 
     using (var strm = new FileStream(file, FileMode.Open)) 
     { 
      foreach (var b in Encoding.UTF8.GetPreamble()) 
      { 
       if (strm.ReadByte() != b) 
        return false; 
      } 

      return true; 
     } 
    } 
+0

Non sono sicuro, ma la cancellazione della cache di Resharper può aiutare a risolvere questo problema. – chromigo

0

Inoltre sto avendo questo problema con un progetto locale che ha funzionato perfettamente in Win8.1/VS2013. Quindi questo non è correlato con TFS o qualsiasi altro repository. È possibile eseguire il salvataggio in UTF-8. Inoltre, ho un Visual Studio russo localizzato che è stato aggiornato in inglese dal Language Pack (odio IDE localizzato e MSDN).

4

Se non si desidera modificare la codifica del codice sorgente, è possibile aggiungere l'elemento di codifica nel file .csproj. Ciò ha contribuito per me (aggiunto in <PropertyGroup> elemento):

<CodePage>1250</CodePage>

Ma naturalmente solo un hack temporanea, inutile per soluzioni con molti progetti.

+0

Questo trucco fa morire il mio designer di Visual Studio con errori "Impossibile trovare il tipo". –

+1

Raccomando vivamente di aggiornare l'aggiornamento 1 RC che risolve questo fastidioso bug (versione 14.0.24627.00). – vasek

Problemi correlati