我的团队不关注文件编码(这是正确的,因为人类不应该被文件编码困扰)。然而,有些文件以 utf8 保存,有些以区域编码 (cp1250) 保存。
我需要做两件事:
如何使用 Visual-Studio、Resharper 插件或 Powershell 实现这些目标?
我尝试使用 PowerShell 执行#2,但它很混乱(有时它会删除/添加最后一行)。可能有一些免费软件可以用来做到这一点,第 1 点对我来说更重要。
是的,这是可能的。
使用
.editorconfig
作为 @Richard 之前提到的。从 Visual Studio v15.3 开始,修复并改进了 .editorconfig
支持。这个简单的 .editorconfig
在解决方案级别足以确保每个 *.cs
都保存在 UTF-8 中,没有 BOM:
root = true
[*.cs]
charset = utf-8
此外,它还可以转换由 Visual Studio 手动打开和保存的任何现有文件。
我测试了线程中的一些答案将 Visual Studio 项目中的所有文件保存为 UTF-8,但它们工作得很糟糕:非拉丁字符(在我的例子中是西里尔字母)已被转换为不可读的字形。相反,Visual Studio 本身完美地完成了“打开-保存”转换。
要自动打开并重新保存解决方案中的所有代码文件,请使用简单的 R# 技巧:
Code Cleanup
feature(默认为 Ctrl+E,C
)将其应用到整个解决方案。选择最简单的内置“重新格式化代码”模板以最大程度地减少更改。 Code Cleanup
。 *.cs
文件都应以 UTF-8 格式保存(对于 R# 支持的其他文件类型也是如此)。漂亮的格式作为奖励。
Environment | Documents | Save documents as Unicode when data cannot be saved in codepage
但这并不
总是。看来没有办法强制执行此操作(并且没有可能的扩展)。有没有考虑过写一个扩展:-) ?
回复。 #2:使用 PSH 应该是可行的(但没有最终的行尾可能会扰乱最简单的方法)。但是请参阅https://stackoverflow.com/a/850751/67392
编辑:这似乎是一个常见的请求(请参阅用户声音)。该用户语音的评论之一要求在 VS2017 中您可以使用 .editorconfig
设置文件的默认编码。
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"
}
}
.cs
部分的
.editorconfig
文件中设置
.cs
文件的编码:
[*.cs]
charset = utf-8
dotnet format
(我最初将其作为评论发布,但 Ilya Chumakov 建议将其作为答案)