Je me demande s'il est possible d'enregistrer tous les fichiers d'un projet Visual Studio 2008 dans un codage de caractères spécifique. J'ai obtenu une solution avec des encodages mixtes et je veux les faire tous pareils (UTF-8 avec signature).
Je sais comment enregistrer des fichiers uniques, mais qu'en est-il de tous les fichiers d'un projet?
Puisque vous êtes déjà dans Visual Studio, pourquoi ne pas simplement écrire le code?
foreach (var f in new DirectoryInfo(@"...").GetFiles("*.cs", SearchOption.AllDirectories)) {
string s = File.ReadAllText(f.FullName);
File.WriteAllText (f.FullName, s, Encoding.UTF8);
}
Seulement trois lignes de code! Je suis sûr que vous pouvez écrire ceci en moins d'une minute :-)
Cela peut être d'une certaine utilité.
lien supprimé en raison de la suppression de la référence d'origine par le site de spam.
Version courte: modifiez un fichier, sélectionnez Fichier -> Options d'enregistrement avancées. Au lieu de remplacer UTF-8 par Ascii, remplacez-le par UTF-8. Modifier: assurez-vous de sélectionner l'option qui indique pas de marqueur d'ordre des octets (BOM)
Définissez la page de codes et cliquez sur OK. Il semble persister juste après le fichier actuel.
Si vous devez le faire dans PowerShell, voici mon petit coup:
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);
}
}
Je convertirais les fichiers par programme (en dehors de VS), par exemple en utilisant un script Python:
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)
Cela suppose que tous les fichiers qui ne sont pas en "UTF-8 avec signature" sont dans la page de code ANSI - c'est la même chose que VS 2008 suppose apparemment aussi. Si vous savez que certains fichiers ont encore des encodages différents, vous devrez spécifier quels sont ces encodages.
Utilisation de C #:
1) Créez une nouvelle ConsoleApplication, puis installez Mozilla Universal Charset Detector
2) Exécuter le code:
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;
}
}
si vous utilisez TFS avec VS: http://msdn.Microsoft.com/en-us/library/1yft8zkw (v = vs.100) .aspx Exemple:
tf checkout -r -type:utf-8 src/*.aspx
Merci pour vos solutions, ce code a fonctionné pour moi:
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
Si vous souhaitez éviter ce type d'erreur:
Utilisez ce code suivant:
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);
}
Le numéro de codage 1252 est le codage Windows par défaut utilisé par Visual Studio pour enregistrer vos fichiers.
J'ai créé une fonction pour changer les fichiers d'encodage écrits dans asp.net. J'ai beaucoup cherché. Et j'ai également utilisé quelques idées et codes de cette page. Merci.
Et voici la fonction.
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
Il peut être placé dans un fichier .aspx puis appelé comme:
ChangeFileEncoding("C:\temp\test", "*.ascx", IO.SearchOption.TopDirectoryOnly)
Je propose uniquement cette suggestion au cas où il n'y aurait aucun moyen de le faire automatiquement dans Visual Studio (je ne suis même pas sûr que cela fonctionnerait):
adapté la version ci-dessus pour le faire fonctionner.
// 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);
}
l'élément est supprimé du menu dans Visual Studio 2017 Vous pouvez toujours accéder à la fonctionnalité via Fichier-> Enregistrer sous -> puis en cliquant sur la flèche vers le bas du bouton Enregistrer et en cliquant sur "Enregistrer avec l'encodage ...".
Vous pouvez également l'ajouter au menu Fichier via Outils-> Personnaliser-> Commandes si vous le souhaitez.
Problèmes de codage éprouvés après la conversion de la solution de VS2008 à VS2015. Après la conversion, tous les fichiers de projet ont été encodés en ANSI, mais ils contenaient du contenu UTF8 et ont été reconnus en tant que fichiers ANSI dans VS2015. A essayé de nombreuses tactiques de conversion, mais n'a fonctionné que cette solution.
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);
}