Visual Studio编码问题

8
我在Visual Studio 2008中遇到了文件编码的问题。在编译时,我遇到了如下错误:
当我尝试打开出错的文件时,会弹出编码窗口:
默认情况下,自动检测被设置。当我将编码选项更改为UTF-8时,一切正常。如果我使用UTF-8编码打开每个有问题的文件,项目就可以编译了。问题是我有太多的文件,一个个打开并设置UTF-8编码是很荒谬的。是否有任何快速解决方法?
我的VS设置如下:
我正在使用Windows Server 2008 R2。
更新:
感谢Hans Passant和Noah Richards的互动。我最近更换了操作系统,一切都是新的。我也从源代码控制中下载了新的解决方案。
在操作系统区域设置中,我将系统语言环境更改为波兰语(波兰):
在VS中,我将国际设置更改为与Windows相同的设置:
问题仍未解决。
当我使用自动检测编码打开某些.cs文件,然后检查“文件->高级保存选项...”,其中一些.cs文件具有代码页1250:
但内部看起来像这样:
这很奇怪,因为当我在源代码控制中检查此类特定文件的属性时,它们似乎已设置为UTF-8编码:
我不明白这个不匹配。
所有其他文件都有UTF-8编码:
并且可以正确打开。我基本上不知道出了什么问题,因为据我所知,我的朋友设置的选项与我相同,而且同样的项目也可以正确地为他编译。但是到目前为止,他还没有遇到过编码问题。

你不能有“太多文件”而以前没有遇到过这个问题。发生了什么变化?你最近切换到这台机器吗?系统代码页改变了吗?这个项目是从VS2005导入的吗?改用了一个不稳定的SCCS?更好地记录你的问题。 - Hans Passant
2个回答

4
那个带抑扬符号的大写字母A告诉我这个文件是UTF-8编码(如果你用十六进制编辑器查看,你可能会发现这些字节是C2 A0)。这是UTF-8中的不间断空格。
Visual Studio无法检测到编码,因为(很可能)文件中没有足够的高ASCII字符来帮助进行可靠的检测。
此外,没有BOM(字节顺序标记)。这将有助于检测(这是“带签名的UTF-8”描述中的“签名”)。
你可以做的是:给所有没有BOM的文件添加BOM。 如何添加?创建一个只有BOM的文件(在记事本中创建一个空文件,另存为,选择UTF-8作为编码)。它将长达3个字节(EF BB BF)。 你可以将其复制到每个缺少BOM的文件的开头。
   copy /b/v BOM.txt + YourFile.cs YourFile_Ok.cs
   ren YourFile.cs YourFile_Org.cs
   ren YourFile_Ok.cs YourFile.cs

请确保BOM文件名称和原始文件名称之间有一个+号。
在一两个文件上尝试一下,如果可以的话,您可以创建一些批处理文件来执行此操作。或者您可以编写一个小的C#应用程序(因为您是一个C#程序员),该程序可以检测文件是否已经有了BOM,以免重复添加。当然,您可以使用几乎任何语言实现这个功能,从Perl到PowerShell再到C++。

谢谢你的回答,解决方案很好。但我朋友似乎没有遇到过这个问题,我们用的是同样的操作系统、相同的源代码(来自同样的SC),我认为设置也是一样的。尽管如此,这个技巧对我很有帮助,也是未来的一个好建议。致敬。 - jwaliszko

1

一旦您以UTF-8模式打开文件,您可以尝试更改文件的高级保存选项并保存它(如果您认为这些文件应该是UTF-8,则保存为带签名的UTF-8)。

自动检测编码是最佳努力,因此很可能文件中的某些内容会导致其被检测为非UTF-8,例如文件的前1KB只有ASCII字符,或者具有指示文件不是UTF-8的BOM。将文件重新保存为带签名的UTF-8应该(希望如此)纠正了这个问题。

如果之后仍然出现此问题,请告诉我,我们可以尝试追踪是什么原因导致它们首先被创建/保存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接