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?


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


¿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.


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

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.


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

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)


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

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.


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

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í.

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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.