在 VisualStudio 中将所有 *.cs 文件转换为 unicode

Convert all *.cs files to unicode in VisualStudio

我的团队不关注文件编码(这是正确的,因为人类不应该被文件编码打扰)。然而,有些文件以 utf8 格式保存,有些以区域编码 (cp1250) 格式保存。

我需要做两件事:

  1. 对将来创建的所有文件强制使用 utf8
  2. 将所有具有给定扩展名(或至少 *.cs)的现有文件转换为 utf-8

如何使用 Visual-Studio、Resharper 插件或 Powershell 实现这些目标?

我尝试使用 PowerShell 执行 #2,但它很乱(有时 removes/adds 最后一行)。可能有一些免费软件可以用来做这件事,第 1 点对我来说更重要。

回复。 #1: 有选项

Environment | Documents | Save documents as Unicode when data cannot be saved in codepage 

但这并不总是。似乎没有办法强制执行此操作(也没有可能的扩展)。有没有考虑过写一个扩展:-)?

回复。 #2:它应该可以用 PSH 实现(但没有最后一行可能会搞乱最简单的方法)。但是请参阅

编辑:这似乎是一个常见的请求(参见User Voice)。关于该用户语音的评论之一要求在 VS2017 中您可以使用 .editorconfig 设置文件的默认编码。

是的,有可能。

对所有文件强制使用 UTF-8

使用前面提到的@Richard .editorconfig。从 Visual Studio v15.3 开始,.editorconfig 支持得到修复和改进。这个解决方案级别的简单 .editorconfig 足以确保每个 *.cs 都保存在没有 BOM 的 UTF-8 中 :

root = true

[*.cs]
charset = utf-8

此外,它会转换由 Visual Studio 手动打开和保存的任何现有文件。

将所有现有代码文件转换为 UTF-8

我测试了线程 Save all files in Visual Studio project as UTF-8 中的一些答案,但它们的效果很差:非拉丁字符(在我的例子中是西里尔字母)已被转换成不可读的字形。相反,Visual Studio 本身可以完美地进行 "open-save" 转换。

要自动打开并重新保存解决方案中的所有代码文件,请使用一个简单的 R# 技巧:

  1. 将适用于所有文件的任何 R# 代码样式规则设置为严格拒绝贵公司代码约定的值。例如,大括号布局是一个明显的选择。
  2. 使用 Code Cleanup feature(默认为 Ctrl+E,C)将其应用于整个解决方案。选择最简单的内置 "Reformat Code" 模板以尽量减少更改。
  3. 所有文件都格式化并保存后,将 R# 规则还原为原始规则并再次 运行 Code Cleanup

之后所有 *.cs 文件都应保存为 UTF-8(对于 R# 支持的其他文件类型也是如此)。漂亮的格式作为奖励。

Powershell 5.1 脚本,运行 在源根目录中

Get-ChildItem -Include *.cs -Recurse | ForEach-Object {
    $file = $_.FullName

    $mustReWrite = $false
    # Try to read as UTF-8 first and throw an exception if
    # invalid-as-UTF-8 bytes are encountered.
    try
    {
        [IO.File]::ReadAllText($file,[Text.Utf8Encoding]::new($false, $true))
    }
    catch [System.Text.DecoderFallbackException]
    {
        # Fall back to Windows-1250
        $content = [IO.File]::ReadAllText($file,[Text.Encoding]::GetEncoding(1250))
        $mustReWrite = $true
    }

    # Rewrite as UTF-8 without BOM (the .NET frameworks' default)
    if ($mustReWrite)
    {
        Write "Converting from 1250 to UTF-8"
        [IO.File]::WriteAllText($file, $content)
    }
    else
    {
        Write "Already UTF-8-encoded"
    }
}