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


87

我想知道是否可以将Visual Studio 2008项目中的所有文件保存为特定的字符编码。我有一个混合编码的解决方案,我想使它们都相同(带签名的UTF-8)。

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


1
您应该知道RC编译器(至少在Visual Studio 2008之前)不支持UTF8文件-对于这些文件,您必须使用UTF16。
bogdan

另外,GlobalSuppressions.cs是UTF-16。
DavidRR

Answers:


74

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

只有三行代码!我敢肯定,您可以在不到一分钟的时间内写出它:-)


子目录呢?具有大量* .cs文件的“属性”子目录?
罗曼·斯塔科夫

3
“ SearchOption.AllDirectories”参数是包括子目录所必需的。我已经相应地编辑了代码。
Timwi

9
我现在已经尝试过了,效果很好。我唯一需要修改的就是使用Encoding.GetEncoding(1252)= Western European(Windows)作为ReadAllText的第二个参数来保留我的瑞典语字符(åäö)。
jesperlind 2011年

38

这可能会有帮助。

链接已删除,因为原始参考已被垃圾邮件站点污损。

短版:编辑一个文件,选择文件->高级保存选项。不必将UTF-8更改为Ascii,而是将其更改为UTF-8。编辑:确保选择不显示字节顺序标记(BOM)的选项

设置代码页并单击确定。它似乎在当前文件之后仍然存在。


9
将其更改为“ Unicode(不带签名的UTF-8)”,否则它将BOM添加到文件的开头。
Chuck Le Butt 2010年

11
也同意...有人为我们设置了物料清单。
Tracker1

12

如果您需要在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);
    }
}

该文件保持为UTF8格式-已在Visual Studio中签名
jenson-button-event

1
Unicode字符在执行后丢失。例如,Ü变成 而©变成 。
Der_Meister

8

我将以编程方式(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显然也假定相同。如果您知道某些文件具有不同的编码,则必须指定这些编码是什么。


5

使用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;
    }
}

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)


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

1

如果要避免此类错误:

在此处输入图片说明

使用以下代码:

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编码。


1

从UTF-8-BOM转换为UTF-8

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

0

我只是提供此建议,以防在Visual Studio中无法自动执行此操作(我什至不确定这是否可行):

  1. 在您的项目中创建一个名为足の不自由なハッキング(或迫使Visual Studio编码为UTF-8的其他Unicode文本)的类。
  2. 添加“使用MyProject。足の不自由なハッキング;” 到每个文件的顶部。通过全局替换“ using System.Text;”,您应该能够对所有内容进行处理。“使用System.Text;使用MyProject。足の不自由なハッキング”。
  3. 保存一切。您可能会得到一个长字符串:“是否要使用UTF-8保存X.cs?” 消息之类的。

10
h,如果您真的想坚持下去,只需添加带有这些字符的注释即可。至少当有人在“编辑”菜单中单击“删除未使用的用法”时,它不会被删除。
罗曼·斯塔科夫

5
添加“使用MyProject。足の不自由なハッキング;” 到每个文件的顶部。-我认为这个问题的主要原因是,不必分别打开每个文件。
珍妮·奥雷利

0

将解决方案从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);
 }

0

该项目已从Visual Studio 2017的菜单中删除。您仍然可以通过“文件”->“另存为”->,然后单击“保存”按钮上的向下箭头并单击“使用编码保存...”来访问该功能。

如果需要,还可以通过工具->自定义->命令将其添加回“文件”菜单。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.