webentwicklung-frage-antwort-db.com.de

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

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 sieht es mit allen Dateien in einem Projekt aus?

78
jesperlind

Warum nicht einfach den Code schreiben, da Sie bereits in Visual Studio sind?

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

65
Timwi

Dies kann hilfreich sein.

der Link wurde entfernt, da der ursprüngliche Verweis von der 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 Keine Bytereihenfolge-Markierung (BOM) auswählen.

Setze Codepage und drücke OK. Es scheint nur nach der aktuellen Datei bestehen zu bleiben.

37
Broam

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

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

Ich würde die Dateien programmgesteuert konvertieren (außerhalb von VS), z. 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, in der ANSI-Codepage befinden - dies ist das gleiche, was VS 2008 anscheinend auch annimmt. Wenn Sie wissen, dass einige Dateien noch andere Codierungen haben, müssen Sie angeben, um welche Codierungen es sich handelt.

7

Verwenden von C #:
1) Erstellen Sie eine neue ConsoleApplication und installieren Sie Mozilla Universal Charset Detector
2) Code ausführen:

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

wenn Sie TFS mit VS verwenden: http://msdn.Microsoft.com/en-us/library/1yft8zkw (v = vs.100) .aspx Beispiel:

tf checkout -r -type:utf-8 src/*.aspx
1
Mase

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

Wenn Sie diese Art von Fehler vermeiden möchten:

enter image description here

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 Windows-Standardcodierung, die von Visual Studio zum Speichern Ihrer Dateien verwendet wird.

1
Maxime Esprit

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

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 einer ASPX-Datei abgelegt und dann wie folgt aufgerufen werden:

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

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 einem anderen Unicode-Text, der die Codierung von Visual Studio als UTF-8 erzwingt).
  2. Fügen Sie "using MyProject. 足 足 の 自由 自由 な ハ キ キ ン ;" 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. Alles speichern. Möglicherweise wird eine lange Zeichenfolge angezeigt: "Möchten Sie X.cs mit UTF-8 speichern?" Nachrichten oder so.
0
MusiGenesis

hat die obige Version angepasst, damit es funktioniert.

// important! create a utf8 encoding that explicitly writes no BOM            
var utf8nobom = new UTF8Encoding(false); 
foreach (var f in new DirectoryInfo(dir).GetFiles("*.*", SearchOption.AllDirectories))
{
    string text = File.ReadAllText(f.FullName);
    File.WriteAllText(f.FullName, text, utf8nobom);
}
0
citykid

das Element wird in Visual Studio 2017 aus dem Menü entfernt. Sie können weiterhin auf die Funktionen zugreifen, indem Sie auf Datei-> Speichern unter -> klicken, dann auf den Abwärtspfeil der Schaltfläche Speichern klicken und auf "Mit Codierung speichern ..." klicken.

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

0

Bei der Konvertierung der Lösung von VS2008 nach 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 Umstellungstaktiken, 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);
 }
0
Janis Rudovskis