Speichern Sie alle Dateien im Visual Studio-Projekt als UTF-8

86

Ich frage mich, ob es möglich ist, alle Dateien in einem Visual Studio 2008-Projekt in einer bestimmten Zeichenkodierung zu speichern. Ich habe eine Lösung mit gemischten Codierungen und möchte sie alle gleich machen (UTF-8 mit Signatur).

Ich weiß, wie man einzelne Dateien speichert, aber wie steht es mit allen Dateien in einem Projekt?

jesperlind
quelle
1
Sie sollten wissen, dass der RC-Compiler (zumindest bis Visual Studio 2008) keine UTF8-Dateien unterstützt. Für diese Dateien müssen Sie UTF16 verwenden.
Bogdan
Auch GlobalSuppressions.csist UTF-16.
DavidRR

Antworten:

72

Da Sie bereits in Visual Studio sind, schreiben Sie einfach den Code.

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

Nur drei Codezeilen! Ich bin sicher, Sie können dies in weniger als einer Minute schreiben :-)

Timwi
quelle
Was ist mit Unterverzeichnissen, z. das Unterverzeichnis "Eigenschaften" mit vielen * .cs-Dateien?
Roman Starkov
3
Der Parameter "SearchOption.AllDirectories" ist alles, was zum Einschließen von Unterverzeichnissen erforderlich ist. Ich habe den Code entsprechend bearbeitet.
Timwi
9
Ich habe es jetzt versucht und es funktioniert großartig. Das einzige, was ich ändern musste, war die Verwendung von Encoding.GetEncoding (1252) = Westeuropäisch (Windows) als zweiten Parameter für ReadAllText, um meine schwedischen Zeichen (åäö) beizubehalten.
Jesperlind
38

Dies kann hilfreich sein.

Link entfernt, da die ursprüngliche Referenz durch die Spam-Site unkenntlich gemacht wurde.

Kurzversion: Bearbeiten Sie eine Datei und wählen Sie Datei -> Erweiterte Speicheroptionen. Anstatt UTF-8 in Ascii zu ändern, ändern Sie es in UTF-8. Bearbeiten: Stellen Sie sicher, dass Sie die Option ohne Byte-Order-Marker (BOM) auswählen.

Codepage einstellen & OK drücken. Es scheint kurz nach der aktuellen Datei zu bestehen.

Broam
quelle
9
Ändern Sie es in "Unicode (UTF-8 ohne Signatur)", andernfalls wird am Anfang der Datei eine Stückliste hinzugefügt.
Chuck Le Butt
11
Einverstanden auch ... jemand hat uns die Stückliste erstellt.
Tracker1
12

Falls Sie dies in PowerShell tun müssen, ist hier mein kleiner Schritt:

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
quelle
Die Datei bleibt als UTF8-signiert in Visual Studio Erweiterte Speicheroptionen
jenson-button-event
1
Unicode-Zeichen gehen nach der Ausführung verloren. Zum Beispiel wird Ü zu und © zu .
Der_Meister
8

Ich würde die Dateien programmgesteuert (außerhalb von VS) konvertieren, z. B. mit einem Python-Skript:

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)

Dies setzt voraus, dass sich alle Dateien, die nicht in "UTF-8 mit Signatur" enthalten sind, auf der ANSI-Codepage befinden - dies ist das gleiche, was VS 2008 anscheinend auch annimmt. Wenn Sie wissen, dass einige Dateien noch unterschiedliche Codierungen haben, müssen Sie angeben, um welche Codierungen es sich handelt.

Martin v. Löwis
quelle
5

Verwenden von C #:
1) Erstellen Sie eine neue ConsoleApplication und installieren Sie dann Mozilla Universal Charset Detector.
2) Führen Sie den Code aus:

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
quelle
1

Ich habe eine Funktion zum Ändern von in asp.net geschriebenen Codierungsdateien erstellt. Ich habe viel gesucht. Und ich habe auch einige Ideen und Codes von dieser Seite verwendet. Danke dir.

Und hier ist die Funktion.

  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

Es kann in eine ASPX-Datei eingefügt und dann wie folgt aufgerufen werden:

ChangeFileEncoding("C:\temp\test", "*.ascx", IO.SearchOption.TopDirectoryOnly)
Podcast
quelle
1

Vielen Dank für Ihre Lösungen, dieser Code hat für mich funktioniert:

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
quelle
1

Wenn Sie diese Art von Fehler vermeiden möchten:

Geben Sie hier die Bildbeschreibung ein

Verwenden Sie diesen folgenden Code:

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

Die Codierungsnummer 1252 ist die Standard-Windows-Codierung, die von Visual Studio zum Speichern Ihrer Dateien verwendet wird.

Maxime Esprit
quelle
1

Konvertieren Sie von UTF-8-BOM nach UTF-8

Aufbauend auf der Antwort von rasx finden Sie hier eine PowerShell-Funktion, die davon ausgeht, dass Ihre aktuellen Dateien bereits in UTF-8 (möglicherweise jedoch mit Stückliste) codiert sind, und sie ohne Stückliste in UTF-8 konvertiert, wodurch vorhandene Unicode-Zeichen erhalten bleiben.

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
quelle
0

Ich biete diesen Vorschlag nur für den Fall an, dass dies in Visual Studio nicht automatisch möglich ist (ich bin mir nicht einmal sicher, ob dies funktionieren würde):

  1. Erstellen Sie in Ihrem Projekt eine Klasse mit dem Namen 足 の 不 自由 な ハ ッ キ ン グ (oder einen anderen Unicode-Text, der Visual Studio zwingt, als UTF-8 zu codieren).
  2. Fügen Sie "using MyProject. 足 の 不 自由 な ハ ッ キ ン グ ;" hinzu. an den Anfang jeder Datei. Sie sollten in der Lage sein, dies für alles zu tun, indem Sie "using System.Text;" global ersetzen. mit "using System.Text; using MyProject. 足 の 不 自由 な ハ ッ キ ン "; ".
  3. Speichern Sie alles. Möglicherweise wird die lange Zeichenfolge "Möchten Sie X.cs mit UTF-8 speichern?" Angezeigt. Nachrichten oder so.
MusiGenesis
quelle
10
Duh, wenn du es wirklich festhalten willst, füge einfach einen Kommentar mit diesen Charakteren hinzu. Zumindest wird es nicht gelöscht, wenn jemand das nächste Mal im Menü Bearbeiten auf "Nicht verwendete Verwendungen entfernen" klickt.
Roman Starkov
5
Fügen Sie "using MyProject. 足 の 不 自由 な ハ ッ キ ン グ;" hinzu. an den Anfang jeder Datei. - Ich denke, der Hauptgrund für die Frage war, nicht jede Datei einzeln öffnen zu müssen.
Jenny O'Reilly
0

Bei der Konvertierung der Lösung von VS2008 auf VS2015 sind Codierungsprobleme aufgetreten. Nach der Konvertierung wurden alle Projektdateien in ANSI codiert, enthielten jedoch UTF8-Inhalte und wurden in VS2015 als ANSI-Dateien erkannt. Versuchte viele Konvertierungstaktiken, funktionierte aber nur mit dieser Lösung.

 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
quelle
0

Das Element wird in Visual Studio 2017 aus dem Menü entfernt. Sie können weiterhin über Datei-> Speichern unter -> auf die Funktionalität zugreifen. Klicken Sie dann auf den Abwärtspfeil auf der Schaltfläche Speichern und dann auf "Mit Codierung speichern ...".

Sie können es auch über Extras-> Anpassen-> Befehle wieder zum Menü Datei hinzufügen, wenn Sie möchten.

Yitzhak Weinberg
quelle