将Visual Studio项目中的所有文件保存为UTF-8

我想知道是否有可能将Visual Studio 2008项目中的所有文件保存为特定的字符编码。 我得到了一个混合编码的解决scheme,我想使他们都一样(带签名的UTF-8)。

我知道如何保存单个文件,但是项目中的所有文件如何?

既然你已经在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); } 

只有三行代码! 我相信你可以在不到一分钟的时间里写下这些:-)

这可能有一些帮助。

由于原始引用被垃圾邮件网站污染,链接被删除。

短版本:编辑一个文件,select文件 – >高级保存选项。 将UTF-8更改为Ascii,而不是将其更改为UTF-8。 编辑:请确保您select说没有字节顺序标记(BOM)

设置代码页并点击确定。 它似乎坚持刚刚过去的当前文件。

如果你需要在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)创build一个新的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; } } 

我已经创build了一个函数来改变在asp.net编写的编码文件。 我搜查了很多。 而且我也使用了这个页面的一些想法和代码。 谢谢。

这是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("<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) 

如果您使用VS的TFS: http : //msdn.microsoft.com/en-us/library/1yft8zkw( v=vs.100) .aspx例如:

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

感谢您的解决scheme,这个代码已经为我工作:

 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 

如果你想避免这种types的错误:

在这里输入图像描述

使用下面的代码:

 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是Visual Studio用于保存文件的默认Windows编码。

我只提供这个build议的情况下,没有办法自动在Visual Studio中做到这一点(我甚至不知道这将工作):

  1. 在您的项目中创build一个名为足の不自由なハッキング (或其他强制Visual Studio编码为UTF-8的unicode文本)的类。
  2. 添加“使用MyProject。 足の不自由なハッキング ;” 到每个文件的顶部。 你应该可以通过全局replace“using System.Text”来做到这一点。 与“使用System.Text;使用MyProject。 足の不自由なハッキング ;”。
  3. 保存一切。 你可能会得到一串“你想用UTF-8保存X.cs吗?” 消息或其他东西。

将解决scheme从VS2008转换到VS2015后经验丰富的编码问题。 转换完成后,所有项目文件都以ANSI编码,但是它们包含UTF8内容,并在VS2015中被识别为ANSI文件。 尝试了很多转换策略,但只有这个解决scheme。

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