Сохраните все файлы в проекте Visual Studio как UTF-8
Интересно, возможно ли сохранить все файлы в проекте Visual Studio 2008 в определенную кодировку символов? У меня есть решение со смешанными кодировками, и я хочу сделать их одинаковыми (UTF-8 с подписью).
Я знаю, как сохранить отдельные файлы, но как насчет всех файлов в проекте?
15 ответов
Поскольку вы уже находитесь в 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);
}
Всего три строки кода! Я уверен, что вы можете написать это менее чем за минуту:-)
Это может помочь.
ссылка удалена из-за того, что исходная ссылка была повреждена спам-сайтом.
Краткая версия: отредактируйте один файл, выберите Файл -> Дополнительные параметры сохранения. Вместо того, чтобы менять UTF-8 на Ascii, измените его на UTF-8. Редактировать: убедитесь, что вы выбрали опцию, которая говорит, что нет байта-порядка-маркера (спецификации)
Установите кодовую страницу и нажмите ОК. Кажется, он сохраняется только после текущего файла.
Если вам нужно сделать это в 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);
}
}
Я бы конвертировал файлы программно (вне 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. Если вы знаете, что некоторые файлы имеют разные кодировки, вам придется указать, что это за кодировки.
Используя 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;
}
}
Лучшим решением в настоящее время является добавление к вашему файлу в папке[*.cs]
(или любой другой формат, который вы хотите):
charset = utf-8
Например, мой.editorconfig
начинается с:
[*.cs]
charset = utf-8
Вы также можете использоватьutf-8-bom
Если вам нужно.
Далее нужно запустить команду формата dotnet в папке с файлом решения, она выполнит свою работу.
Сделанный!
Если вы используете TFS с VS: http://msdn.microsoft.com/en-us/library/1yft8zkw(v=vs.100).aspx Пример:
tf checkout -r -type:utf-8 src/*.aspx
Я создал функцию для изменения файлов кодировки, написанных на 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)
Преобразование из UTF-8-BOM в UTF-8
Основываясь на ответе rasx, вот функция PowerShell, которая предполагает, что ваши текущие файлы уже закодированы в UTF-8 (но, возможно, с спецификацией), и преобразует их в UTF-8 без спецификации, тем самым сохраняя существующие символы Unicode.
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);
}
}
Если вы хотите избежать ошибок этого типа:
Используйте этот следующий код:
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 для сохранения ваших файлов.
Спасибо за ваши решения, этот код работал для меня:
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
Опытные проблемы кодирования после преобразования решения из VS2008 в VS2015. После преобразования все файлы проекта были закодированы в ANSI, но они содержали содержимое UTF8 и были повторно признаны как файлы 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);
}
Адаптировал версию выше, чтобы она работала.
// 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);
}
Этот элемент удален из меню в Visual Studio 2017 Вы можете получить доступ к функциональности через Файл-> Сохранить как ->, затем нажав стрелку вниз на кнопке Сохранить и нажав "Сохранить с кодировкой...".
Вы также можете добавить его обратно в меню Файл через Сервис-> Настройка-> Команды, если хотите.
Я предлагаю это только в том случае, если в Visual Studio нет способа сделать это автоматически (я даже не уверен, что это сработает):
- Создайте в своем проекте класс с именем 足の不自由なハッキン or (или другой текст в кодировке Юникод, который заставит Visual Studio кодировать как UTF-8).
- Добавить "используя MyProject.足の不自由なハッキン グ;" в начало каждого файла. Вы должны быть в состоянии сделать это на всем, сделав глобальную замену "using System.Text;" с "используя System.Text; используя MyProject.足の不自由なハッキン";".
- Сохрани все. Вы можете получить длинную строку "Хотите сохранить X.cs, используя UTF-8?" сообщения или что-то.