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?


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ę :-)


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.


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

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.


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

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)


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

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.


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

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ś.

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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.