Zapisz wszystkie pliki w projekcie programu Visual Studio jako UTF-8

87

Zastanawiam się, czy można zapisać wszystkie pliki w projekcie Visual Studio 2008 w określonym kodowaniu znaków. Mam rozwiązanie z mieszanymi kodowaniami i chcę, aby wszystkie były takie same (UTF-8 z podpisem).

Wiem, jak zapisywać pojedyncze pliki, ale co ze wszystkimi plikami w projekcie?

jesperlind
źródło
1
Powinieneś wiedzieć, że kompilator RC (przynajmniej do Visual Studio 2008) nie obsługuje plików UTF8 - do tych plików musisz użyć UTF16.
bogdan
Jest też GlobalSuppressions.csUTF-16.
DavidRR,

Odpowiedzi:

74

Skoro już pracujesz w programie Visual Studio, dlaczego po prostu nie napiszesz kodu?

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

Tylko trzy linijki kodu! Jestem pewien, że możesz to napisać w mniej niż minutę :-)

Timwi
źródło
A co z podkatalogami, np. podkatalog "Właściwości" z dużą ilością plików * .cs?
Roman Starkov
3
Parametr „SearchOption.AllDirectories” to wszystko, co jest potrzebne do uwzględnienia podkatalogów. Odpowiednio zredagowałem kod.
Timwi
9
Wypróbowałem to i działa świetnie. Jedyną rzeczą, którą musiałem zmodyfikować, było użycie Encoding.GetEncoding (1252) = Western European (Windows) jako drugiego parametru ReadAllText, aby zachować moje szwedzkie znaki (åäö).
jesperlind
38

To może być pomocne.

link został usunięty, ponieważ pierwotne odniesienie zostało zniszczone przez witrynę spamującą.

Krótka wersja: edytuj jeden plik, wybierz Plik -> Zaawansowane opcje zapisywania. Zamiast zmieniać UTF-8 na Ascii, zmień go na UTF-8. Edycja: upewnij się, że wybrałeś opcję bez znacznika kolejności bajtów (BOM)

Ustaw stronę kodową i naciśnij OK. Wydaje się, że utrzymuje się tuż obok bieżącego pliku.

Broam
źródło
9
Zmień to na „Unicode (UTF-8 bez podpisu)”, w przeciwnym razie doda BOM na początku pliku.
Chuck Le Butt,
11
Zgoda też ... ktoś ustawił nam zestawienie komponentów.
Tracker 1
12

Jeśli musisz to zrobić w PowerShell, oto mój mały ruch:

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
źródło
Plik pozostaje z
podpisem
1
Znaki Unicode są tracone po wykonaniu. Na przykład Ü staje się , a © staje się .
Der_Meister
8

Konwertowałbym pliki programowo (poza VS), np. Za pomocą skryptu w Pythonie:

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)

Zakłada się, że wszystkie pliki spoza „UTF-8 z podpisem” znajdują się na stronie kodowej ANSI - to jest to samo, co najwyraźniej zakłada również VS 2008. Jeśli wiesz, że niektóre pliki mają jeszcze inne kodowania, musisz określić, jakie to kodowania.

Martin przeciwko Löwis
źródło
5

Używając C #:
1) Utwórz nową aplikację ConsoleApplication, a następnie zainstaluj Mozilla Universal Charset Detector
2) Uruchom kod:

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;
    }
}
Bruce
źródło
1

Utworzyłem funkcję do zmiany plików kodowania napisanych w asp.net. Szukałem dużo. Wykorzystałem też kilka pomysłów i kodów z tej strony. Dziękuję Ci.

A oto funkcja.

  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

Można go umieścić w pliku .aspx, a następnie nazwać:

ChangeFileEncoding("C:\temp\test", "*.ascx", IO.SearchOption.TopDirectoryOnly)
podcast
źródło
1

Dzięki za rozwiązania, ten kod zadziałał dla mnie:

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
Ehsan
źródło
1

Jeśli chcesz uniknąć tego typu błędów:

wprowadź opis obrazu tutaj

Użyj tego kodu:

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);
            }

Numer kodowania 1252 to domyślne kodowanie systemu Windows używane przez program Visual Studio do zapisywania plików.

Maxime Esprit
źródło
1

Konwertuj z UTF-8-BOM na UTF-8

Opierając się na odpowiedzi rasx , oto funkcja PowerShell, która zakłada, że ​​twoje bieżące pliki są już zakodowane w UTF-8 (ale może z BOM) i konwertuje je na UTF-8 bez BOM, zachowując w ten sposób istniejące znaki 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);
    }
}
Bruno Zell
źródło
0

Proponuję tę sugestię tylko na wypadek, gdyby nie było możliwości automatycznego zrobienia tego w programie Visual Studio (nie jestem nawet pewien, czy to zadziała):

  1. Utwórz w projekcie klasę o nazwie足 の 不 自由 な ハ ッ キ ン グ(lub inny tekst Unicode, który zmusi program Visual Studio do kodowania jako UTF-8).
  2. Dodaj „używając MyProject.足 の 不 自由 な ハ ッ キ ン グ;” na początek każdego pliku. Powinieneś móc to zrobić na wszystkim, wykonując globalną zamianę "using System.Text;" z „using System.Text; using MyProject.足 の 不 自由 な ハ ッ キ ン グ;”.
  3. Zapisz wszystko. Możesz otrzymać długi ciąg „Czy chcesz zapisać X.cs używając UTF-8?” wiadomości czy coś.
MusiGenesis
źródło
10
Duh, jeśli naprawdę chcesz, aby to się przylgnęło, po prostu dodaj komentarz z tymi postaciami. Przynajmniej nie zostanie usunięty następnym razem, gdy ktoś wybierze opcję „Usuń nieużywane zastosowania” w menu Edycja.
Roman Starkov
5
Dodaj „używając MyProject. 足 の 不 自由 な ハ ッ キ ン グ;” na początek każdego pliku. - Myślę, że głównym powodem pytania był brak konieczności otwierania każdego pliku osobno.
Krisztián Balla
0

Doświadczone problemy z kodowaniem po konwersji rozwiązania z VS2008 na VS2015. Po konwersji wszystkie pliki projektu zostały zakodowane w ANSI, ale zawierały zawartość UTF8 i zostały rozpoznane jako pliki ANSI w VS2015. Próbowałem wielu taktyk konwersji, ale działało tylko to rozwiązanie.

 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);
 }
Janis Rudovskis
źródło
0

element zostanie usunięty z menu w programie Visual Studio 2017. Nadal można uzyskać dostęp do funkcji za pomocą opcji Plik-> Zapisz jako -> następnie klikając strzałkę w dół na przycisku Zapisz i klikając „Zapisz z kodowaniem ...”.

Możesz także dodać go z powrotem do menu Plik poprzez Narzędzia-> Dostosuj-> Polecenia, jeśli chcesz.

Yitzhak Weinberg
źródło