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?
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 :-)
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.
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);
}
}
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.
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;
}
}
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
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
Wenn Sie diese Art von Fehler vermeiden möchten:
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.
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)
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):
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);
}
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.
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);
}