Guarde todos los archivos en el proyecto de Visual Studio como UTF-8

87

Me pregunto si es posible guardar todos los archivos de un proyecto de Visual Studio 2008 en una codificación de caracteres específica. Obtuve una solución con codificaciones mixtas y quiero hacerlas todas iguales (UTF-8 con firma).

Sé cómo guardar archivos individuales, pero ¿qué hay de todos los archivos de un proyecto?

jesperlind
fuente
1
Debe saber que el compilador RC (al menos hasta Visual Studio 2008) no admite archivos UTF8; para estos archivos debe usar UTF16.
bogdan
Además, GlobalSuppressions.cses UTF-16.
DavidRR

Respuestas:

74

Dado que ya está en Visual Studio, ¿por qué no simplemente escribir el código?

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

¡Solo tres líneas de código! Estoy seguro de que puedes escribir esto en menos de un minuto :-)

Timwi
fuente
¿Qué pasa con los subdirectorios, por ejemplo. el subdirectorio "Propiedades" con muchos archivos * .cs?
Roman Starkov
3
El parámetro "SearchOption.AllDirectories" es todo lo que se necesita para incluir subdirectorios. He editado el código en consecuencia.
Timwi
9
Ahora lo he probado y funciona muy bien. Lo único que tuve que modificar fue usar Encoding.GetEncoding (1252) = Western European (Windows) como segundo parámetro de ReadAllText para preservar mis caracteres suecos (åäö).
jesperlind
38

Esto puede ser de alguna ayuda.

enlace eliminado debido a que la referencia original fue desfigurada por un sitio de spam.

Versión corta: edite un archivo, seleccione Archivo -> Opciones avanzadas para guardar. En lugar de cambiar UTF-8 a Ascii, cámbielo a UTF-8. Editar: asegúrese de seleccionar la opción que dice sin marcador de orden de bytes (BOM)

Configure la página de códigos y presione Aceptar. Parece persistir justo después del archivo actual.

Broam
fuente
9
Cámbielo a "Unicode (UTF-8 sin firma)"; de lo contrario, agregará una lista de materiales al principio del archivo.
Chuck Le Butt
11
También de acuerdo ... alguien nos creó la lista de materiales.
Tracker1
12

En caso de que necesite hacer esto en PowerShell, aquí está mi pequeño movimiento:

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
fuente
El archivo permanece como UTF8 firmado en Visual Studio Opciones avanzadas de guardado
jenson-button-event
1
Los caracteres Unicode se pierden después de la ejecución. Por ejemplo, Ü se convierte en y © se convierte en .
Der_Meister
8

Convertiría los archivos mediante programación (fuera de VS), por ejemplo, usando un script de 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)

Esto supone que todos los archivos que no están en "UTF-8 con firma" están en la página de códigos ANSI; esto es lo mismo que aparentemente VS 2008 también asume. Si sabe que algunos archivos tienen codificaciones diferentes, deberá especificar cuáles son estas codificaciones.

Martin contra Löwis
fuente
5

Usando C #:
1) Cree una nueva aplicación de consola, luego instale Mozilla Universal Charset Detector
2) Ejecute el código:

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

He creado una función para cambiar los archivos de codificación escritos en asp.net. Busqué mucho. Y también utilicé algunas ideas y códigos de esta página. Gracias.

Y aquí está la función.

  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

Se puede colocar en un archivo .aspx y luego se llama como:

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

Gracias por sus soluciones, este código me ha funcionado:

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

Si quiere evitar este tipo de error:

ingrese la descripción de la imagen aquí

Utilice este siguiente código:

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

El número de codificación 1252 es la codificación predeterminada de Windows que utiliza Visual Studio para guardar sus archivos.

Maxime Esprit
fuente
1

Convertir de UTF-8-BOM a UTF-8

Sobre la base de la respuesta de rasx , aquí hay una función de PowerShell que asume que sus archivos actuales ya están codificados en UTF-8 (pero tal vez con BOM) y los convierte a UTF-8 sin BOM, por lo que conserva los caracteres Unicode existentes.

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
fuente
0

Solo estoy ofreciendo esta sugerencia en caso de que no haya forma de hacer esto automáticamente en Visual Studio (ni siquiera estoy seguro de que esto funcione):

  1. Cree una clase en su proyecto llamada足 の 不 自由 な ハ ッ キ ン グ(o algún otro texto Unicode que obligue a Visual Studio a codificar como UTF-8).
  2. Agregue "usando MyProject.足 の 不 自由 な ハ ッ キ ン グ;" al principio de cada archivo. Debería poder hacerlo en todo mediante una sustitución global de "using System.Text;" con "usando System.Text; usando MyProject.足 の 不 自由 な ハ ッ キ ン グ;".
  3. Guarda todo. Es posible que obtenga una cadena larga de "¿Desea guardar X.cs usando UTF-8?" mensajes o algo así.
MusiGenesis
fuente
10
Duh, si realmente quieres que se quede, solo agrega un comentario con esos personajes. Al menos no se eliminará la próxima vez que alguien vaya a "Eliminar usos no utilizados" en el menú Editar.
Roman Starkov
5
Agregue "usando MyProject. 足 の 不 自由 な ハ ッ キ ン グ;" al principio de cada archivo. - Creo que la razón principal de la pregunta fue no tener que abrir cada archivo por separado.
Jenny O'Reilly
0

Problemas de codificación experimentados después de convertir la solución de VS2008 a VS2015. Después de la conversión, todos los archivos del proyecto se codificaron en ANSI, pero contenían contenido UTF8 y se reconocieron como archivos ANSI en VS2015. Probé muchas tácticas de conversión, pero solo funcionó esta solución.

 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
fuente
0

el elemento se elimina del menú en Visual Studio 2017. Aún puede acceder a la funcionalidad a través de Archivo-> Guardar como -> luego haciendo clic en la flecha hacia abajo en el botón Guardar y haciendo clic en "Guardar con codificación ...".

También puede volver a agregarlo al menú Archivo a través de Herramientas-> Personalizar-> Comandos si lo desea.

Yitzhak Weinberg
fuente