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

Gostaria de saber se é possível salvar todos os arquivos em um projeto do Visual Studio 2008 em uma codificação de caracteres específica. Eu tenho 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 quanto a todos os arquivos em um projeto?

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 🙂

Isto pode ser de alguma ajuda.

link removido devido à referência original sendo desfigurada pelo site de spam.

Versão curta: edite um arquivo, selecione File -> Advanced Save Options. Em vez de mudar o UTF-8 para o Ascii, mude para UTF-8. Editar: certifique-se de selecionar a opção que diz que não há marcador de ordem de bytes (BOM)

Definir página de código e clique em OK. Parece persistir apenas após o arquivo atual.

Caso você precise fazer isso no PowerShell, aqui está minha pequena jogada:

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

Eu converteria 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” estejam na página de código ANSI – é o mesmo que o VS 2008 aparentemente também assume. Se você sabe que alguns arquivos ainda têm codificações diferentes, você deve especificar quais são essas codificações.

Usando C #:
1) Crie um novo ConsoleApplication e instale o Mozilla Universal Charset Detector
2) código de execução:

 static void Main(string[] args) { const string targetEncoding = "utf-8"; foreach (var f in new DirectoryInfo(@"").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; } } 

Eu criei uma function 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 function.

  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("
Saved #" & Counter & ": " & fi.FullName & " - Encoding was: " & gEnc.EncodingName & "") End If Next Return Counter End Function

Pode ser colocado no arquivo .aspx e depois ser chamado como:

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

se você estiver usando o TFS com o VS: http://msdn.microsoft.com/en-us/library/1yft8zkw(v=vs.100).aspx Exemplo:

 tf checkout -r -type:utf-8 src/*.aspx 

Obrigado pelas 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 

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

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

Só estou oferecendo essa sugestão caso não haja maneira de fazer isso automaticamente no Visual Studio (nem tenho certeza de que isso funcionaria):

  1. Crie uma class em seu projeto chamado 足 の 不 自由 な ハ ッ キ ン グ (ou algum outro texto unicode que forçará o Visual Studio a codificar como UTF-8).
  2. Adicionar “usando MyProject”. ” para o topo de cada arquivo. Você deve ser capaz de fazer isso em tudo, fazendo uma substituição global de “using System.Text;” com “using System.Text; using MyProject.. の 不 自由 な ハ ッ キ ン グ “.
  3. Salve tudo. Você pode obter uma longa seqüência de “Você deseja salvar X.cs usando UTF-8?” mensagens ou algo assim.

Problemas de codificação experientes após a conversão da solução do VS2008 para o VS2015. Após a conversão, todos os arquivos de 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 trabalhei 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); } 

adaptou a versão acima para fazê-lo funcionar.

 // important! create a utf8 encoding that explicitly writes no BOM var utf8nobom = new UTF8Encoding(false); foreach (var f in new DirectoryInfo(dir).GetFiles("*.*", SearchOption.AllDirectories)) { string text = File.ReadAllText(f.FullName); File.WriteAllText(f.FullName, text, utf8nobom); }