我正在使用以下命令读取文件:
var source = File.ReadAllText(path);字符©加载不正确。
然后,我将其更改为:
var source = File.ReadAllText(path, Encoding.UTF8);什么都没有。
我决定试着用
var source = File.ReadAllText(path, Encoding.Default);而且它工作得很完美。然后我对它进行了调试,并试图找出是哪种编码起到了作用,我发现它就是UTF-7。
我想知道的是:
是否推荐使用Encoding.Default,能保证读取文件中的所有字符都没有问题吗?
发布于 2011-05-15 12:14:34
Encoding.Default只会保证所有的UTF-7字符集都能被正确读取(谷歌搜索整个字符集)。另一方面,如果您尝试在UTF-8模式下读取非UTF-8编码的文件,您将得到损坏的字符。
例如,如果文件是UTF-16编码的,并且您以UTF-16模式读取它,那么即使该文件不包含任何特定于UTF-16的字符,也是可以的。这一切都归结为文件的编码。
您将需要使用相同的编码执行保存-重新打开操作,以避免损坏。否则,尝试尽可能多地使用UTF7,因为它是最紧凑但又“电子邮件安全”的编码,这就是为什么它是大多数.NET框架设置中的默认编码。
发布于 2011-05-15 12:17:54
不建议使用Encoding.Default。
引用自MSDN:
不同的计算机可以使用不同的编码作为默认编码,甚至可以在一台计算机上更改默认编码。因此,从一台计算机流到另一台计算机的数据,甚至在同一计算机上的不同时间检索的数据可能会被错误转换。此外,Default属性返回的编码使用最佳回退将不支持的字符映射到代码页支持的字符。出于这两个原因,通常不建议使用默认编码。为了确保正确解码编码的字节,您的应用程序应该使用带有前同步码的Unicode编码,例如UTF8Encoding或UnicodeEncoding。另一种选择是使用更高级的协议,以确保编码和解码使用相同的格式。
发布于 2011-05-15 12:54:25
听起来你对自动检测文件的编码感兴趣,在某种情况下,你不能控制用来保存它的编码。在StackOverflow上有几个问题可以解决这个问题;一些粗略的浏览指出Determine a string's encoding in C#是一个很好的解决方案。我最喜欢的答案是the one pointing to a C# port of Mozilla's universal charset detector。
https://stackoverflow.com/questions/6006422
复制相似问题