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?
visual-studio
utf-8
character-encoding
jesperlind
źródło
źródło
GlobalSuppressions.cs
UTF-16.Odpowiedzi:
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ę :-)
źródło
To może być pomocne.
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.
źródło
Jeśli musisz to zrobić w PowerShell, oto mój mały ruch:
źródło
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.
źródło
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; } }
źródło
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ć:
źródło
jeśli używasz TFS z VS: http://msdn.microsoft.com/en-us/library/1yft8zkw(v=vs.100).aspx Przykład:
źródło
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
źródło
Jeśli chcesz uniknąć tego typu błędów:
Użyj tego kodu:
Numer kodowania 1252 to domyślne kodowanie systemu Windows używane przez program Visual Studio do zapisywania plików.
źródło
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.
źródło
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):
źródło
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); }
źródło
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.
źródło