91 votes

Enregistrer tous les fichiers du projet Visual Studio en 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 une solution avec des encodages mixtes et je veux qu'ils soient tous identiques (UTF-8 avec signature).

Je sais comment enregistrer des fichiers individuels, mais comment enregistrer tous les fichiers d'un projet ?

1 votes

Vous devez savoir que le compilateur RC (au moins jusqu'à Visual Studio 2008) ne supporte pas les fichiers UTF8 - pour ces fichiers, vous devez utiliser UTF16.

0 votes

Aussi, GlobalSuppressions.cs est UTF-16.

76voto

Timwi Points 30896

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 l'écrire en moins d'une minute :-)

0 votes

Qu'en est-il des sous-répertoires, par exemple le sous-répertoire "Propriétés" contenant de nombreux fichiers *.cs ?

3 votes

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.

9 votes

Je viens de l'essayer et cela fonctionne très bien. La seule chose que j'ai dû modifier était d'utiliser Encoding.GetEncoding(1252)=Western European (Windows) comme deuxième paramètre de ReadAllText pour préserver mes caractères suédois (åäö).

40voto

Broam Points 2646

Cela peut être utile.

lien supprimé en raison de la dégradation de la référence originale par un 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. Edit : Assurez-vous que vous sélectionnez l'option qui dit pas de marqueur d'ordre d'octet (BOM).

Définir la page de code et cliquer sur ok. Il semble persister juste après le fichier actuel.

9 votes

Changez-le en "Unicode (UTF-8 sans signature)", sinon il ajoutera un BOM au début du fichier.

13 votes

Je suis d'accord aussi... quelqu'un nous a piégé la MOB.

12voto

rasx Points 1858

Au cas où vous auriez besoin de faire cela en 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);
    }
}

0 votes

Le fichier reste en UTF8-Signed dans visual studio Options de sauvegarde avancées

1 votes

Les caractères Unicode sont perdus après l'exécution. Par exemple, Ü devient et © devient .

8voto

Martin v. Löwis Points 61768

Je convertirais les fichiers de manière programmatique (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 ce que VS 2008 suppose aussi apparemment. Si vous savez que certains fichiers ont des encodages encore différents, vous devriez spécifier quels sont ces encodages.

1voto

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X