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

jes*_*ind 80 utf-8 character-encoding visual-studio

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

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

Tim*_*mwi 67

由于您已经在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);
}
Run Code Online (Sandbox Code Playgroud)

只有三行代码!我相信你可以在不到一分钟内写出来:-)

  • 我现在已经尝试过了,效果很好.我唯一需要修改的是使用Encoding.GetEncoding(1252)=西欧(Windows)作为ReadAllText的第二个参数来保存我的瑞典字符(åäö). (9认同)
  • "SearchOption.AllDirectories"参数是包含子目录所必需的.我已经相应地编辑了代码. (3认同)

Bro*_*oam 37

这可能会有所帮助.

由于原始引用被垃圾网站破坏而删除了链接.

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

设置代码页并点击确定.它似乎只是暂存在当前文件之后.

  • 同意......有人建立了BOM. (10认同)
  • 将其更改为"Unicode(UTF-8无签名)",否则会将BOM添加到文件的开头. (8认同)

ras*_*asx 11

如果您需要在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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*wis 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)
Run Code Online (Sandbox Code Playgroud)

这假设所有不在"带签名的UTF-8"的文件都在ANSI代码页中 - 这与VS 2008显然也假设的相同.如果您知道某些文件具有不同的编码,则必须指定这些编码是什么.


Bru*_*uce 6

使用 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;
    }
}
Run Code Online (Sandbox Code Playgroud)