2008-11-11 4 views
73

Интересно, возможно ли сохранить все файлы в проекте Visual Studio 2008 в кодировку определенного символа. Я получил решение со смешанными кодировками, и я хочу сделать их одинаковыми (UTF-8 с подписью).Сохранить все файлы в проекте Visual Studio как UTF-8

Я знаю, как сохранить отдельные файлы, но как насчет всех файлов в проекте?

+1

Вы должны знать, что компилятор RC (как минимум до Visual Studio 2008) не поддерживает файлы UTF8 - для этих файлов вам необходимо использовать UTF16. – bogdan 2009-12-23 12:32:53

+0

Кроме того, [`GlobalSuppressions.cs`] (http://stackoverflow.com/q/33614568/1497596) является UTF-16. – DavidRR 2017-01-05 14:05:26

ответ

61

Поскольку вы уже находитесь в Visual Studio, почему бы просто не просто написать код?

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

Только три строки кода! Я уверен, что вы можете написать это менее чем за минуту :-)

+0

Что касается подкаталогов, например. поддерева «Свойства» с большим количеством файлов * .cs? – 2009-05-12 09:21:28

0

Я только предлагая это предложение в случае, если не существует способа, чтобы делать это автоматически в Visual Studio (я даже не уверен, что это будет работать):

  1. Создать класс в проекте под названием 足の 不 自由 な ハ ッ キ ン グ (или какой-либо другой текст в Юникоде, который заставит Visual Studio кодировать как UTF-8).
  2. Добавить «using MyProject. 足 の 不 自由 な ハ ッ ッ グ グ; вверху каждого файла. Вы должны сделать это на всех, выполнив глобальную замену «using System.Text;» с использованием «System.Text» с использованием MyProject. 足 の 不 自由 な ハ ッ キ ン; ».
  3. Сохраните все. Вы можете получить длинную строку «Вы хотите сохранить X.cs с помощью UTF-8?» сообщения или что-то еще.
+10

Дух, если вы действительно хотите, чтобы он был прикреплен, просто добавьте * комментарий * с этими символами. По крайней мере, он не удаляется в следующий раз, когда кто-то отправляется «Удалить неиспользуемые действия» в меню «Правка». – 2009-05-11 22:55:44

+5

Добавить «using MyProject. 足 の 不 自由 な ハ ッ キ ン グ;» вверху каждого файла. - Я думаю, что основная причина этого вопроса заключалась в том, чтобы не открывать каждый файл отдельно. – 2013-07-04 07:53:52

7

Я бы преобразовал файлы программно (вне VS), например. используя скрипт 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) 

Это принимает на себя все файлы, которые не в «UTF-8 с подписью» в странице ANSI код - это то же самое, что, по-видимому, также принимает на себя VS 2008. Если вы знаете, что некоторые файлы имеют разные кодировки, вам нужно будет указать, каковы эти кодировки.

10

В случае, если вам нужно сделать это в PowerShell, вот мой маленький шаг:

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

Спасибо за ваши решения, этот код работал для меня:

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 
36

Это может быть полезно.

ссылка удалена из-за ссылки на оригинал, поврежденный сайтом спама.

Краткая версия: отредактируйте один файл, выберите Файл -> Расширенные параметры сохранения. Вместо изменения UTF-8 в Ascii измените его на UTF-8. Редактирование: убедитесь, что вы выбрали опцию, которая не указана без байта-маркера (BOM)

Указать код страницы & hit ok. Кажется, он сохраняется только за текущим файлом.

1

Я создал функцию для изменения файлов кодировки, написанных на asp.net. Я много искал. И я также использовал некоторые идеи и коды с этой страницы. Спасибо.

И вот функция.

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 

Он может поместить в .aspx файл, а затем называется как:

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

Использование C#:
1) Создайте новый ConsoleApplication, затем установите Mozilla Universal Charset Detector
2) код Пробег:

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

Опытные проблемы кодирования после преобразования решения от VS2008 к VS2015. После преобразования все файлы проекта были закодированы в ANSI, но они содержали содержимое UTF8 и были recongnized как файлы ANSI в VS2015. Пробовал многие тактики преобразования, но работал только с этим решением.

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

Если вы хотите, чтобы избежать такого рода ошибки:

enter image description here

Используйте этот следующий код:

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

Кодирование номер 1252 является кодировка Windows, по умолчанию используется Visual Studio для сохранения ваших файлов.

0

адаптировал версию выше, чтобы заставить ее работать.

// 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); 
} 
Смежные вопросы