Сохраните все файлы в проекте Visual Studio как UTF-8

87

Интересно, можно ли сохранить все файлы в проекте Visual Studio 2008 в определенной кодировке символов. У меня есть решение со смешанными кодировками, и я хочу сделать их одинаковыми (UTF-8 с подписью).

Я знаю, как сохранять отдельные файлы, но как насчет всех файлов в проекте?

Джесперлинд
источник
1
Вы должны знать, что компилятор RC (по крайней мере, до Visual Studio 2008) не поддерживает файлы UTF8 - для этих файлов вы должны использовать UTF16.
Богдан
Кроме того, GlobalSuppressions.csэто UTF-16.
DavidRR

Ответы:

74

Поскольку вы уже работаете в Visual Studio, почему бы просто не написать код?

foreach (var f in new DirectoryInfo(@"...").GetFiles("*.cs", SearchOption.AllDirectories)) {
  string s = File.ReadAllText(f.FullName);
  File.WriteAllText (f.FullName, s, Encoding.UTF8);
}

Всего три строчки кода! Я уверен, что вы сможете написать это меньше чем за минуту :-)

Тимви
источник
А как насчет подкаталогов, например. подкаталог "Свойства" с большим количеством файлов * .cs?
Роман Старков
3
Параметр SearchOption.AllDirectories - это все, что необходимо для включения подкаталогов. Я соответствующим образом отредактировал код.
Timwi
9
Я сейчас попробовал, и он отлично работает. Единственное, что мне пришлось изменить, это использовать Encoding.GetEncoding (1252) = Western European (Windows) в качестве второго параметра ReadAllText, чтобы сохранить мои шведские символы (åäö).
jesperlind
38

Это может помочь.

ссылка удалена из-за того, что исходная ссылка была искажена спам-сайтом.

Краткая версия: отредактируйте один файл, выберите File -> Advanced Save Options. Вместо того, чтобы менять UTF-8 на Ascii, измените его на UTF-8. Изменить: убедитесь, что вы выбрали параметр, который говорит, что маркер порядка байтов (BOM)

Установите кодовую страницу и нажмите ОК. Кажется, что он сохраняется только после текущего файла.

Броам
источник
9
Измените его на «Unicode (UTF-8 без подписи)», иначе спецификация будет добавлена ​​в начало файла.
Чак Ле Батт
11
Тоже согласен ... кто-то установил нам спецификацию.
Tracker1 09
12

Если вам нужно сделать это в PowerShell, вот мой маленький ход:

Function Write-Utf8([string] $path, [string] $filter='*.*')
{
    [IO.SearchOption] $option = [IO.SearchOption]::AllDirectories;
    [String[]] $files = [IO.Directory]::GetFiles((Get-Item $path).FullName, $filter, $option);
    foreach($file in $files)
    {
        "Writing $file...";
        [String]$s = [IO.File]::ReadAllText($file);
        [IO.File]::WriteAllText($file, $s, [Text.Encoding]::UTF8);
    }
}
rasx
источник
Файл остается с подписью UTF8 в Visual Studio Расширенные параметры сохранения
jenson-button-event
1
После выполнения символы Unicode теряются. Например, Ü становится , а © становится .
Der_Meister
8

Я бы преобразовал файлы программно (вне VS), например, используя скрипт Python:

import glob, codecs

for f in glob.glob("*.py"):
    data = open("f", "rb").read()
    if data.startswith(codecs.BOM_UTF8):
        # Already UTF-8
        continue
    # else assume ANSI code page
    data = data.decode("mbcs")
    data = codecs.BOM_UTF8 + data.encode("utf-8")
    open("f", "wb").write(data)

Это предполагает, что все файлы не в «UTF-8 с подписью» находятся на кодовой странице ANSI - это то же самое, что, по-видимому, предполагает и VS 2008. Если вы знаете, что некоторые файлы имеют разные кодировки, вам необходимо указать, что это за кодировки.

Мартин против Лёвиса
источник
5

Использование C #:
1) Создайте новое ConsoleApplication, затем установите Mozilla Universal Charset Detector
2) Выполните код:

static void Main(string[] args)
{
    const string targetEncoding = "utf-8";
    foreach (var f in new DirectoryInfo(@"<your project's path>").GetFiles("*.cs", SearchOption.AllDirectories))
    {
        var fileEnc = GetEncoding(f.FullName);
        if (fileEnc != null && !string.Equals(fileEnc, targetEncoding, StringComparison.OrdinalIgnoreCase))
        {
            var str = File.ReadAllText(f.FullName, Encoding.GetEncoding(fileEnc));
            File.WriteAllText(f.FullName, str, Encoding.GetEncoding(targetEncoding));
        }
    }
    Console.WriteLine("Done.");
    Console.ReadKey();
}

private static string GetEncoding(string filename)
{
    using (var fs = File.OpenRead(filename))
    {
        var cdet = new Ude.CharsetDetector();
        cdet.Feed(fs);
        cdet.DataEnd();
        if (cdet.Charset != null)
            Console.WriteLine("Charset: {0}, confidence: {1} : " + filename, cdet.Charset, cdet.Confidence);
        else
            Console.WriteLine("Detection failed: " + filename);
        return cdet.Charset;
    }
}
Брюс
источник
1

Я создал функцию для изменения файлов кодировки, написанных на asp.net. Я много искал. И я также использовал некоторые идеи и коды с этой страницы. Спасибо.

А вот и функция.

  Function ChangeFileEncoding(pPathFolder As String, pExtension As String, pDirOption As IO.SearchOption) As Integer

    Dim Counter As Integer
    Dim s As String
    Dim reader As IO.StreamReader
    Dim gEnc As Text.Encoding
    Dim direc As IO.DirectoryInfo = New IO.DirectoryInfo(pPathFolder)
    For Each fi As IO.FileInfo In direc.GetFiles(pExtension, pDirOption)
        s = ""
        reader = New IO.StreamReader(fi.FullName, Text.Encoding.Default, True)
        s = reader.ReadToEnd
        gEnc = reader.CurrentEncoding
        reader.Close()

        If (gEnc.EncodingName <> Text.Encoding.UTF8.EncodingName) Then
            s = IO.File.ReadAllText(fi.FullName, gEnc)
            IO.File.WriteAllText(fi.FullName, s, System.Text.Encoding.UTF8)
            Counter += 1
            Response.Write("<br>Saved #" & Counter & ": " & fi.FullName & " - <i>Encoding was: " & gEnc.EncodingName & "</i>")
        End If
    Next

    Return Counter
End Function

Его можно поместить в файл .aspx и затем вызвать так:

ChangeFileEncoding("C:\temp\test", "*.ascx", IO.SearchOption.TopDirectoryOnly)
подкаст
источник
1

Спасибо за ваши решения, этот код у меня сработал:

Dim s As String = ""
Dim direc As DirectoryInfo = New DirectoryInfo("Your Directory path")

For Each fi As FileInfo In direc.GetFiles("*.vb", SearchOption.AllDirectories)
    s = File.ReadAllText(fi.FullName, System.Text.Encoding.Default)
    File.WriteAllText(fi.FullName, s, System.Text.Encoding.Unicode)
Next
Эхсан
источник
1

Если вы хотите избежать ошибок этого типа:

введите описание изображения здесь

Используйте следующий код:

foreach (var f in new DirectoryInfo(@"....").GetFiles("*.cs", SearchOption.AllDirectories))
            {
                string s = File.ReadAllText(f.FullName, Encoding.GetEncoding(1252));
                File.WriteAllText(f.FullName, s, Encoding.UTF8);
            }

Кодировка номер 1252 - это кодировка Windows по умолчанию, используемая Visual Studio для сохранения ваших файлов.

Максим Эсприт
источник
1

Преобразование из UTF-8-BOM в UTF-8

Основываясь на ответе rasx , вот функция PowerShell, которая предполагает, что ваши текущие файлы уже закодированы в UTF-8 (но, возможно, с спецификацией), и преобразует их в UTF-8 без спецификации, тем самым сохраняя существующие символы Unicode.

Function Write-Utf8([string] $path, [string] $filter='*')
{
    [IO.SearchOption] $option = [IO.SearchOption]::AllDirectories;
    [String[]] $files = [IO.Directory]::GetFiles((Get-Item $path).FullName, $filter, $option);
    foreach($file in $files)
    {
        "Writing $file...";
        [String]$s = [IO.File]::ReadAllText($file, [Text.Encoding]::UTF8);
        [Text.Encoding]$e = New-Object -TypeName Text.UTF8Encoding -ArgumentList ($false);
        [IO.File]::WriteAllText($file, $s, $e);
    }
}
Бруно Зелл
источник
0

Я предлагаю это предложение только на тот случай, если в Visual Studio нет возможности сделать это автоматически (я даже не уверен, что это сработает):

  1. Создайте в своем проекте класс с именем足 の 不 自由 な ハ ッ キ ン グ(или какой-либо другой текст в Юникоде, который заставит Visual Studio кодировать как UTF-8).
  2. Добавьте «using MyProject.足 の 不 自由 な ハ ッ キ ン グ;» в начало каждого файла. Вы должны иметь возможность делать это для всего, выполнив глобальную замену «using System.Text;» с "using System.Text; using MyProject.足 の 不 自由 な ハ ッ ン グ;".
  3. Сохраните все. Вы можете получить длинную строку «Вы хотите сохранить X.cs, используя UTF-8?» сообщения или что-то в этом роде.
MusiGenesis
источник
10
Да, если вы действительно хотите, чтобы это закрепилось, просто добавьте комментарий с этими символами. По крайней мере, он не будет удален в следующий раз, когда кто-то выберет «Удалить неиспользуемые использования» в меню «Правка».
Роман Старков
5
Добавьте «using MyProject. 足 の 不 自由 な ハ ッ キ ン グ;» в начало каждого файла. - Я думаю, что основная причина вопроса заключалась в том, чтобы не открывать каждый файл отдельно.
Дженни О'Рейли
0

Возникли проблемы с кодированием после преобразования решения из VS2008 в VS2015. После преобразования все файлы проекта были закодированы в ANSI, но они содержали контент UTF8 и были преобразованы в файлы ANSI в VS2015. Пробовал много тактик конверсии, но сработал только это решение.

 Encoding encoding = Encoding.Default;
 String original = String.Empty;
 foreach (var f in new DirectoryInfo(path).GetFiles("*.cs", SearchOption.AllDirectories))
 {
    using (StreamReader sr = new StreamReader(f.FullName, Encoding.Default))
    {
       original = sr.ReadToEnd();
       encoding = sr.CurrentEncoding;
       sr.Close();
    }
    if (encoding == Encoding.UTF8)
       continue;
    byte[] encBytes = encoding.GetBytes(original);
    byte[] utf8Bytes = Encoding.Convert(encoding, Encoding.UTF8, encBytes);
    var utf8Text = Encoding.UTF8.GetString(utf8Bytes);

    File.WriteAllText(f.FullName, utf8Text, Encoding.UTF8);
 }
Янис Рудовскис
источник
0

этот элемент удален из меню в Visual Studio 2017. Вы по-прежнему можете получить доступ к функциям, выбрав «Файл» -> «Сохранить как» ->, затем щелкнув стрелку вниз на кнопке «Сохранить» и выбрав «Сохранить с кодировкой ...».

Вы также можете добавить его обратно в меню «Файл» через Инструменты-> Настроить-> Команды, если хотите.

Ицхак Вайнберг
источник