Salva tutti i file nel progetto Visual Studio come UTF-8


87

Mi chiedo se sia possibile salvare tutti i file in un progetto Visual Studio 2008 in una codifica di caratteri specifica. Ho una soluzione con codifiche miste e voglio renderle tutte uguali (UTF-8 con firma).

So come salvare singoli file, ma che ne dici di tutti i file in un progetto?


1
Dovresti sapere che il compilatore RC (almeno fino a Visual Studio 2008) non supporta i file UTF8 - per questi file devi usare UTF16.
bogdan

Inoltre, GlobalSuppressions.csè UTF-16.
DavidRR

Risposte:


74

Dato che sei già in Visual Studio, perché non scrivere semplicemente il codice?

foreach (var f in new DirectoryInfo(@"...").GetFiles("*.cs", SearchOption.AllDirectories)) {
  string s = File.ReadAllText(f.FullName);
  File.WriteAllText (f.FullName, s, Encoding.UTF8);
}

Solo tre righe di codice! Sono sicuro che puoi scrivere questo in meno di un minuto :-)


E le sottodirectory, ad es. la sottodirectory "Proprietà" con molti file * .cs?
Roman Starkov

3
Il parametro "SearchOption.AllDirectories" è tutto ciò che è necessario per includere le sottodirectory. Ho modificato il codice di conseguenza.
Timwi

9
Ora l'ho provato e funziona benissimo. L'unica cosa che ho dovuto modificare era usare Encoding.GetEncoding (1252) = Europa occidentale (Windows) come secondo parametro di ReadAllText per preservare i miei caratteri svedesi (åäö).
jesperlind

38

Questo può essere di qualche aiuto.

collegamento rimosso perché il riferimento originale è stato deturpato dal sito di spam.

Versione breve: modifica un file, seleziona File -> Opzioni di salvataggio avanzate. Invece di cambiare UTF-8 in Ascii, cambiarlo in UTF-8. Modifica: assicurati di selezionare l'opzione che dice no byte-order-marker (BOM)

Imposta la code page e premi ok. Sembra persistere appena oltre il file corrente.


9
Modificalo in "Unicode (UTF-8 senza firma)", altrimenti aggiungerà un BOM all'inizio del file.
Chuck Le Butt

11
D'accordo anche ... qualcuno ci ha organizzato il BOM.
Tracker1

12

Nel caso in cui sia necessario farlo in PowerShell, ecco la mia piccola mossa:

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

Il file rimane come UTF8-Signed in visual studio Opzioni di salvataggio avanzate
jenson-button-event

1
I caratteri Unicode vengono persi dopo l'esecuzione. Ad esempio, Ü diventa e © diventa .
Der_Meister

8

Vorrei convertire i file in modo programmatico (al di fuori di VS), ad esempio utilizzando uno 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)

Ciò presuppone che tutti i file non in "UTF-8 con firma" siano nella codepage ANSI - questo è lo stesso che apparentemente presume anche VS 2008. Se sai che alcuni file hanno codifiche ancora diverse, devi specificare quali sono queste codifiche.


5

Utilizzando C #:
1) Crea una nuova ConsoleApplication, quindi installa Mozilla Universal Charset Detector
2) Esegui codice:

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

1

Ho creato una funzione per modificare i file di codifica scritti in asp.net. Ho cercato molto. E ho anche usato alcune idee e codici da questa pagina. Grazie.

Ed ecco la funzione.

  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

Può essere inserito nel file .aspx e quindi chiamato come:

ChangeFileEncoding("C:\temp\test", "*.ascx", IO.SearchOption.TopDirectoryOnly)


1

Grazie per le tue soluzioni, questo codice ha funzionato per me:

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

Se vuoi evitare questo tipo di errore:

inserisci qui la descrizione dell'immagine

Usa questo codice seguente:

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

Il numero di codifica 1252 è la codifica Windows predefinita utilizzata da Visual Studio per salvare i file.


1

Converti da UTF-8-BOM a UTF-8

Basandosi sulla risposta di rasx , ecco una funzione PowerShell che presuppone che i file correnti siano già codificati in UTF-8 (ma forse con BOM) e li converte in UTF-8 senza BOM, preservando quindi i caratteri Unicode esistenti.

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

0

Sto solo offrendo questo suggerimento nel caso in cui non ci sia modo di farlo automaticamente in Visual Studio (non sono nemmeno sicuro che funzionerebbe):

  1. Crea una classe nel tuo progetto denominata足 の 不 自由 な ハ ッ キ ン グ(o un altro testo Unicode che costringerà Visual Studio a codificare come UTF-8).
  2. Aggiungi "utilizzando MyProject.足 の 不 自由 な ハ ッ キ ン グ;" all'inizio di ogni file. Dovresti essere in grado di farlo su tutto sostituendo a livello globale "using System.Text;" con "utilizzando System.Text; utilizzando MyProject.足 の 不 自由 な ハ ッ キ ン グ;".
  3. Salva tutto. Potresti ricevere una lunga stringa di "Salvare X.cs usando UTF-8?" messaggi o qualcosa del genere.

10
Duh, se vuoi davvero che rimanga incollato, aggiungi un commento con quei personaggi. Almeno non verrà cancellato la prossima volta che qualcuno va "Rimuovi usi inutilizzati" nel menu Modifica.
Roman Starkov

5
Aggiungi "utilizzando MyProject. 足 の 不 自由 な ハ ッ キ ン グ;" all'inizio di ogni file. - Penso che il motivo principale della domanda fosse non dover aprire ogni file separatamente.
Krisztián Balla

0

Problemi di codifica esperti dopo la conversione della soluzione da VS2008 a VS2015. Dopo la conversione tutti i file di progetto sono stati codificati in ANSI, ma contenevano contenuto UTF8 ed è stato riconosciuto come file ANSI in VS2015. Ho provato molte tattiche di conversione, ma ha funzionato solo con questa soluzione.

 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

l'elemento viene rimosso dal menu in Visual Studio 2017 È comunque possibile accedere alla funzionalità tramite File-> Salva con nome -> quindi facendo clic sulla freccia in giù sul pulsante Salva e facendo clic su "Salva con codifica ...".

Puoi anche aggiungerlo di nuovo al menu File tramite Strumenti-> Personalizza-> Comandi, se lo desideri.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.