6

Мой код:Ошибка строки кодирования (Windows 10 + Visual Studio 2015 + Net 4.6)

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

Когда я Keys.ElementAt(0), у меня есть это: {[Íàáåã_0, raid_0]}. Конечно, когда я запускаю программу, key = "Набег_0" не определен и программа вылетает с System.Collections.Generic.KeyNotFoundException

Этот код работал хорошо, когда у меня был ОС Windows 8.1 + Visual Studio 2013 + чистый 3,5

Как это исправить ?

+0

Звучит так, будто у вас всегда была ошибка. Каким-то образом ключ Íàáåã_0 находится на уровне нуля вместо Ha6er_0. – jdweng

+0

Ключи написаны на русском языке. Цель состоит в том, чтобы понять английский смысл. Перед обновлением до Windows 10 + .Net 4.6 + код Visual Studio 2015 работал отлично. Ясно видно, что новая визуальная студия больше не понимает русский язык. Может винить окна или .net. Я бы не хотел менять все свои руководства на английском языке, так как это потребует значительных изменений в программе. P. S. извините за автоматический перевод – lantsev1981

+1

Это кодировка. Похоже, у вас есть символы Юникода. По умолчанию используется класс по умолчанию для ascii-кодирования. Похоже, вам нужно указать кодировку Unicode в одном из ваших классов. – jdweng

ответ

6

Вы как-то убедились в компиляторе C#, что ваш исходный код был написан на кодовой странице 1251, кодовой странице по умолчанию в Восточной Европе и России. Это обычно вызвано тем, что в текстовом файле отсутствует спецификация utf-8. Неясно, как это произошло, возможно, вы создали файл с текстовым редактором, отличным от того, который был встроен в Visual Studio. Возможно, это искалечено контролем источника, те, у которых фон Unix, как правило, отбрасывают спецификацию.

Откройте исходный файл в Visual Studio и убедитесь, что он по-прежнему читается правильно. Затем используйте «Файл»> «Сохранить как», щелкните стрелку на кнопке «Сохранить», выберите «с кодировкой» и выберите «Юникод (UTF-8 с подписью)».

Также убедитесь, что по умолчанию все еще хорошо. Файл> Расширенные параметры сохранения> при необходимости измените кодировку. Если вы обычно используете другой текстовый редактор, вам нужно сконфигурировать его, чтобы он сохранял файлы с помощью спецификации.

+0

Повторное сохранение файлов в UTF-8 помогло, но до сих пор неясно, как получилось, что все мои файлы были в ANSI. Возможно, виноват TFS. Теперь мне нужно просмотреть все файлы для присутствия кодировки UTF-8, а проект ... Большое вам спасибо за помощь! – lantsev1981

+0

Он работал отлично до Visual Studio 2015 даже с файлами в кодировке 1251. Кажется, это ошибка в Visual Studio, о чем упоминалось в следующем ответе. – tyger

5

У меня такая же проблема, в моем случае это был ReSharper, который сохранил мои файлы в windows-1251 после применения рефакторинга «переместить класс в отдельный файл».

Я использовал этот тест для преобразования всех моих файлов cs в репо в 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

Я не уверен, но очистка кэша Resharper может помочь решить эту проблему. – chromigo

0

У меня также возникла проблема с локальным проектом, который отлично работал в Win8.1/VS2013. Таким образом, это не связано с TFS или любым другим репозиторием. Помощь при сохранении UTF-8. Кроме того, у меня есть русская локализованная Visual Studio, которая была обновлена ​​на английском языке языковым пакетом (ненавижу локализованные IDE и MSDN).

4

Это известная ошибка в версии Visual Studio 2015 Relase. См. https://github.com/dotnet/roslyn/issues/4022. Он уже исправлен и будет доступен в следующей версии набора инструментов (1.1)

+0

Спасибо за полезную информацию! – lantsev1981

4

Если вы не хотите изменять кодировку исходного кода, вы можете добавить элемент кодировки в файл .csproj. Это помогло мне (добавлено в <PropertyGroup> элемент):

<CodePage>1250</CodePage>

Но, конечно, только временный хак, бесполезный для решений с большим количеством проектов.

+0

Этот хак заставляет моего дизайнера визуальной студии умереть с ошибками «Не удалось найти тип». –

+1

Я настоятельно рекомендую обновить Update 1 RC, который исправляет эту неприятную ошибку (версия 14.0.24627.00). – vasek