web-dev-qa-db-fra.com

Enregistrer tous les fichiers du projet Visual Studio au format UTF-8

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?

78
jesperlind

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

65
Timwi

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.

37
Broam

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

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.

7
Martin v. Löwis

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

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

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

Si vous souhaitez éviter ce type d'erreur:

enter image description here

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.

1
Maxime Esprit

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)
1
podcast

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

  1. Créez une classe dans votre projet nommée 足 の 不 自由 な ハ ッ キ ン グ (ou un autre texte unicode qui forcera Visual Studio à coder en UTF-8).
  2. Ajouter "à l'aide de MyProject .足 の 不 自由 な ハ ッ キ ン グ;" en haut de chaque fichier. Vous devriez pouvoir le faire sur tout en remplaçant globalement "using System.Text;" avec "using System.Text; using MyProject .足 の 不 自由 な ハ ッ キ ン グ;".
  3. Sauvegardez tout. Vous pouvez obtenir une longue chaîne de "Voulez-vous enregistrer X.cs en utilisant UTF-8?" des messages ou quelque chose.
0
MusiGenesis

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

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.

0
Yitzhak Weinberg

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);
 }
0
Janis Rudovskis