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

87

Je me demande s'il est possible d'enregistrer tous les fichiers d'un projet Visual Studio 2008 dans un encodage de caractères spécifique. J'ai eu une solution avec des encodages mixtes et je veux les rendre tous identiques (UTF-8 avec signature).

Je sais comment enregistrer des fichiers uniques, mais qu'en est-il de tous les fichiers d'un projet?

jesperlind
la source
1
Vous devez savoir que le compilateur RC (au moins jusqu'à Visual Studio 2008) ne prend pas en charge les fichiers UTF8 - pour ces fichiers, vous devez utiliser UTF16.
bogdan
Aussi, GlobalSuppressions.csest UTF-16.
DavidRR

Réponses:

74

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

Timwi
la source
Qu'en est-il des sous-répertoires, par exemple. le sous-répertoire "Propriétés" avec beaucoup de fichiers * .cs?
Roman Starkov
3
Le paramètre "SearchOption.AllDirectories" est tout ce qui est nécessaire pour inclure les sous-répertoires. J'ai modifié le code en conséquence.
Timwi
9
Je l'ai maintenant essayé et cela fonctionne très bien. La seule chose que j'avais à modifier était d'utiliser Encoding.GetEncoding (1252) = Western European (Windows) comme deuxième paramètre de ReadAllText pour conserver mes caractères suédois (åäö).
jesperlind
38

Cela peut être utile.

lien supprimé car la référence d'origine a été altérée par le site de spam

Version courte: modifiez un fichier, sélectionnez Fichier -> Options d'enregistrement avancées. Au lieu de changer UTF-8 en Ascii, changez-le en UTF-8. Modifier: assurez-vous de sélectionner l'option qui dit pas de marqueur d'ordre des octets (BOM)

Définissez la page de codes et appuyez sur OK. Il semble persister juste après le fichier actuel.

Broam
la source
9
Changez-le en "Unicode (UTF-8 sans signature)", sinon il ajoutera une nomenclature au début du fichier.
Chuck Le Butt
11
D'accord aussi ... quelqu'un nous a créé la nomenclature.
Tracker1
12

Au cas où vous auriez besoin de le faire dans PowerShell, voici mon petit geste:

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);
    }
}
rasx
la source
Le fichier reste au format UTF8 signé dans Visual Studio Options de sauvegarde avancées
jenson-button-event
1
Les caractères Unicode sont perdus après l'exécution. Par exemple, Ü devient et © devient .
Der_Meister
8

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 dans "UTF-8 avec signature" sont dans la page de codes ANSI - c'est la même chose que VS 2008 suppose apparemment également. Si vous savez que certains fichiers ont encore des encodages différents, vous devrez spécifier quels sont ces encodages.

Martin c.Löwis
la source
5

En utilisant C #:
1) Créez une nouvelle ConsoleApplication, puis installez Mozilla Universal Charset Detector
2) Exécutez 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;
    }
}
Bruce
la source
1

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)
Podcast
la source
1

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

Si vous souhaitez éviter ce type d'erreur:

entrez la description de l'image ici

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.

Maxime Esprit
la source
1

Passer de UTF-8-BOM à UTF-8

En s'appuyant sur la réponse de rasx , voici une fonction PowerShell qui suppose que vos fichiers actuels sont déjà encodés en UTF-8 (mais peut-être avec BOM) et les convertit en UTF-8 sans BOM, préservant ainsi les caractères Unicode existants.

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, [Text.Encoding]::UTF8);
        [Text.Encoding]$e = New-Object -TypeName Text.UTF8Encoding -ArgumentList ($false);
        [IO.File]::WriteAllText($file, $s, $e);
    }
}
Bruno Zell
la source
0

Je ne propose cette suggestion qu'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 à encoder en UTF-8).
  2. Ajoutez "en utilisant MyProject.足 の 不 自由 な ハ ッ キ ン グ;" en haut de chaque fichier. Vous devriez pouvoir le faire sur tout en effectuant un remplacement global de "using System.Text;" avec "en utilisant System.Text; en utilisant MyProject.足 の 不 自由 な ハ ッ キ ン グ;".
  3. Sauvegardez tout. Vous pouvez obtenir une longue chaîne de "Voulez-vous enregistrer X.cs en utilisant UTF-8?" messages ou quelque chose.
MusiGenesis
la source
10
Duh, si vous voulez vraiment que ça colle, ajoutez simplement un commentaire avec ces personnages. Au moins, il ne sera pas supprimé la prochaine fois que quelqu'un va supprimer les utilisations inutilisées dans le menu Edition.
Roman Starkov
5
Ajoutez "en utilisant MyProject. 足 の 不 自由 な ハ ッ キ ン グ;" en haut de chaque fichier. - Je pense que la raison principale de la question était de ne pas avoir à ouvrir chaque fichier séparément.
Jenny O'Reilly
0

Problèmes d'encodage expérimenté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. J'ai 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);
 }
Janis Rudovskis
la source
0

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 sur le bouton Enregistrer et en cliquant sur "Enregistrer avec encodage ...".

Vous pouvez également l'ajouter au menu Fichier via Outils-> Personnaliser-> Commandes si vous le souhaitez.

Yitzhak Weinberg
la source