【问题标题】:Convert all *.cs files to unicode in VisualStudio在 VisualStudio 中将所有 *.cs 文件转换为 unicode
【发布时间】:2017-05-05 09:08:01
【问题描述】:

我的团队不关注文件编码(这是正确的,因为人类不应该被文件编码所困扰)。但是有些文件保存在 utf8 中,有些是区域编码(cp1250)。

我需要做两件事:

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

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

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

【问题讨论】:

    标签: visual-studio unicode utf-8 resharper visual-studio-2017


    【解决方案1】:

    是的,有可能。

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

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

    root = true
    
    [*.cs]
    charset = utf-8
    

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

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

    我测试了线程 Save all files in Visual Studio project as UTF-8 的一些答案,但它们效果不佳:非拉丁字符(在我的例子中是西里尔字母)已被转换为不可读的字形。相反,Visual Studio 本身完美地完成了“打开-保存”转换。

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

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

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

    【讨论】:

      【解决方案2】:

      回复。 #1:有选项

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

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

      回复。 #2:它应该可以使用 PSH(但没有最后一行可能会弄乱最简单的方法)。不过见https://stackoverflow.com/a/850751/67392

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

      【讨论】:

      • 有人用editorconfig 实现了UTF-8 吗?根据我的经验,VS 2017 15.2 完全忽略了charset 设置。
      【解决方案3】:

      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"
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-01
        • 2014-04-18
        • 2017-04-23
        • 2010-09-25
        • 2010-11-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多