Salve todos os arquivos no projeto do Visual Studio como UTF-8

87

Eu me pergunto se é possível salvar todos os arquivos em um projeto do Visual Studio 2008 em uma codificação de caracteres específica. Consegui uma solução com codificações mistas e quero torná-las todas iguais (UTF-8 com assinatura).

Eu sei como salvar arquivos individuais, mas e todos os arquivos em um projeto?

Jesperlind
fonte
1
Você deve saber que o compilador RC (pelo menos até o Visual Studio 2008) não oferece suporte a arquivos UTF8 - para esses arquivos, você deve usar UTF16.
bogdan
Além disso, GlobalSuppressions.csé UTF-16.
DavidRR

Respostas:

74

Já que você já está no Visual Studio, por que não simplesmente escrever o 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);
}

Apenas três linhas de código! Tenho certeza que você pode escrever isso em menos de um minuto :-)

Timwi
fonte
E quanto a subdiretórios, por exemplo. o subdiretório "Propriedades" com muitos arquivos * .cs?
Roman Starkov
3
O parâmetro "SearchOption.AllDirectories" é tudo o que é necessário para incluir subdiretórios. Eu editei o código de acordo.
Timwi
9
Eu tentei agora e funciona muito bem. A única coisa que tive de modificar foi usar Encoding.GetEncoding (1252) = Western European (Windows) como o segundo parâmetro para ReadAllText para preservar meus caracteres suecos (åäö).
jesperlind de
38

Isto pode ser de alguma ajuda.

link removido devido a referência original sendo apagada por site de spam.

Versão resumida: edite um arquivo, selecione Arquivo -> Opções avançadas de salvamento. Em vez de alterar UTF-8 para Ascii, altere-o para UTF-8. Editar: certifique-se de selecionar a opção que diz sem marcador de ordem de byte (BOM)

Defina a página de código e clique em OK. Parece persistir logo após o arquivo atual.

Broam
fonte
9
Altere para "Unicode (UTF-8 sem assinatura)", caso contrário, adicionará um BOM ao início do arquivo.
Chuck Le Butt
11
Também concordou ... alguém nos criou o BOM.
Tracker1
12

Caso você precise fazer isso no PowerShell, aqui está meu pequeno movimento:

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
fonte
O arquivo permanece como assinado em UTF8 no visual studio Opções avançadas de salvamento
jenson-button-event
1
Os caracteres Unicode são perdidos após a execução. Por exemplo, Ü torna-se e © torna-se .
Der_Meister
8

Gostaria de converter os arquivos programaticamente (fora do VS), por exemplo, usando um 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)

Isso pressupõe que todos os arquivos que não estão em "UTF-8 com assinatura" estão na página de código ANSI - é o mesmo que o VS 2008 aparentemente também assume. Se você sabe que alguns arquivos ainda possuem codificações diferentes, você terá que especificar quais são essas codificações.

Martin v. Löwis
fonte
5

Usando C #:
1) Crie um novo ConsoleApplication e instale o Mozilla Universal Charset Detector
2) Execute o 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
fonte
1

Eu criei uma função para alterar os arquivos de codificação escritos em asp.net. Eu procurei muito. E também usei algumas ideias e códigos desta página. Obrigado.

E aqui está a função.

  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

Ele pode ser colocado em um arquivo .aspx e, em seguida, chamado como:

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

Obrigado por suas soluções, este código funcionou para mim:

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

Se você quiser evitar esse tipo de erro:

insira a descrição da imagem aqui

Use este código a seguir:

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

O número de codificação 1252 é a codificação padrão do Windows usada pelo Visual Studio para salvar seus arquivos.

Maxime Esprit
fonte
1

Converter de UTF-8-BOM em UTF-8

Com base na resposta do rasx , aqui está uma função do PowerShell que assume que seus arquivos atuais já estão codificados em UTF-8 (mas talvez com BOM) e os converte em UTF-8 sem BOM, preservando, portanto, os 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
fonte
0

Estou apenas oferecendo esta sugestão caso não haja uma maneira de fazer isso automaticamente no Visual Studio (nem tenho certeza se isso funcionaria):

  1. Crie uma classe em seu projeto chamada足 の 不 自由 な ハ ッ キ ン グ(ou algum outro texto Unicode que force o Visual Studio a codificar como UTF-8).
  2. Adicione "usando MeuProjeto.足 の 不 自由 な ハ ッ キ ン グ;" no início de cada arquivo. Você deve ser capaz de fazer isso em tudo fazendo uma substituição global de "using System.Text;" com "usando System.Text; usando MyProject.足 の 不 自由 な ハ ッ キ ン グ;".
  3. Salve tudo. Você pode obter uma longa sequência de "Deseja salvar X.cs usando UTF-8?" mensagens ou algo assim.
MusiGenesis
fonte
10
Duh, se você realmente quiser que ele continue, basta adicionar um comentário com esses personagens. Pelo menos ele não será excluído da próxima vez que alguém clicar em "Remover utilizações não utilizadas" no menu Editar.
Roman Starkov
5
Adicione "usando MeuProjeto. 足 の 不 自由 な ハ ッ キ ン グ;" no início de cada arquivo. - Acho que o principal motivo da pergunta foi, não ter que abrir cada arquivo separadamente.
Jenny O'Reilly
0

Experimentou problemas de codificação após a conversão da solução de VS2008 para VS2015. Após a conversão, todos os arquivos do projeto foram codificados em ANSI, mas continham conteúdo UTF8 e foram reconhecidos como arquivos ANSI no VS2015. Tentei muitas táticas de conversão, mas funcionou apenas esta solução.

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

o item é removido do menu no Visual Studio 2017 Você ainda pode acessar a funcionalidade por meio de Arquivo-> Salvar como -> clicando na seta para baixo no botão Salvar e clicando em "Salvar com codificação ...".

Você também pode adicioná-lo de volta ao menu Arquivo através de Ferramentas-> Personalizar-> Comandos se desejar.

Yitzhak Weinberg
fonte