我想知道是否可以将Visual Studio 2008项目中的所有文件保存为特定的字符编码。我有一个混合编码的解决方案,我想使它们都相同(带签名的UTF-8)。
我知道如何保存单个文件,但是项目中的所有文件又如何呢?
我想知道是否可以将Visual Studio 2008项目中的所有文件保存为特定的字符编码。我有一个混合编码的解决方案,我想使它们都相同(带签名的UTF-8)。
我知道如何保存单个文件,但是项目中的所有文件又如何呢?
GlobalSuppressions.cs
是UTF-16。
Answers:
既然您已经在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。编辑:确保选择不显示字节顺序标记(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)创建一个新的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;
}
}
我创建了一个函数来更改用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)
如果您将TFS与VS一起使用:http : //msdn.microsoft.com/zh-cn/library/1yft8zkw( v=vs.100) .aspx 示例:
tf checkout -r -type:utf-8 src/*.aspx
感谢您的解决方案,此代码对我有用:
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
基于rasx的答案,这是一个PowerShell函数,该函数假定您当前的文件已经使用UTF-8编码(但可能使用BOM),并将其转换为不带BOM的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);
}
}
我只是提供此建议,以防在Visual Studio中无法自动执行此操作(我什至不确定这是否可行):
将解决方案从VS2008转换为VS2015后遇到编码问题。转换后,所有项目文件均以ANSI编码,但它们包含UTF8内容,在VS2015中被重新识别为ANSI文件。尝试了许多转换策略,但仅解决了此问题。
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);
}