Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 编码.Default在.NET中如何工作?_C#_File_File Io_Encoding_Io - Fatal编程技术网

C# 编码.Default在.NET中如何工作?

C# 编码.Default在.NET中如何工作?,c#,file,file-io,encoding,io,C#,File,File Io,Encoding,Io,我正在使用以下命令读取文件: var source = File.ReadAllText(path); 字符)加载不正确 然后,我把它改成: var source = File.ReadAllText(path, Encoding.UTF8); 什么也没有 我决定尝试使用 var source = File.ReadAllText(path, Encoding.Default); 它工作得很好。 然后我调试了它,并试图找出哪个编码起作用,我发现它是UTF-7 我想知道的是: 是否建议使用编

我正在使用以下命令读取文件:

var source = File.ReadAllText(path);
字符
加载不正确

然后,我把它改成:

var source = File.ReadAllText(path, Encoding.UTF8);
什么也没有

我决定尝试使用

var source = File.ReadAllText(path, Encoding.Default);
它工作得很好。 然后我调试了它,并试图找出哪个编码起作用,我发现它是
UTF-7

我想知道的是:


是否建议使用
编码。默认值
,它能保证读取文件中的所有字符时不会出现问题吗?

编码。默认值只保证正确读取所有UTF-7字符集(整个字符集使用谷歌)。另一方面,如果您尝试在UTF-8模式下读取未使用UTF-8编码的文件,您将像以前一样获得损坏的字符

例如,如果文件编码为UTF-16,并且以UTF-16模式读取,则即使文件不包含单个UTF-16特定字符,也可以。这一切归结为文件的编码


您将需要使用相同的编码执行保存-重新打开操作,以防止损坏。否则,请尽可能多地使用UTF-7,因为它是最紧凑但“电子邮件安全”的编码,这就是为什么在大多数.NET framework设置中它是默认编码。

不建议使用encoding.default

引自

不同的计算机可以使用不同的 编码为默认值,并且 默认编码甚至可以在一个应用程序上更改 一台电脑。因此,数据 从一台计算机传输到另一台计算机 甚至在不同的时间检索 在同一台计算机上可能是 翻译错误。此外 默认情况下返回的编码 属性使用最佳拟合回退映射 不支持的字符到字符 由代码页支持。为了这些 两个原因,使用默认值 通常不建议使用编码。 确保编码的字节是 正确解码后,您的应用程序 应使用Unicode编码,例如 UTF8编码或Unicode编码,带有 序言。另一个选择是使用 更高级别的协议,以确保 相同的格式用于编码 和解码


我认为ur文件是utf-7编码的,仅此而已。
访问此页面

听起来您对自动检测文件的编码很感兴趣,在某种情况下,您无法控制用于保存文件的编码。解决这个问题有几个问题;一些粗略的浏览表明这是一个相当不错的选择。我最喜欢的答案是。

但是如果该文件使用的是
UTF-16
,该怎么办?所有编码的情况都是一样的吗?如果是UTF-16,你唯一的机会就是在UTF-16模式下打开它,但我确信,通过去掉不符合UTF-8的字符,它将向下转换为UTF-8。@TeomanSoygul没有“不符合UTF-8的字符”;任何字符都可以用UTF8或UTF16编码,在您使用“字符”时,文本已经被解码了。至于字节,你不能简单地确定它;它们都遵循特定的位模式。最后,为了转换它们,您只需将它们解码为一个,然后编码为另一个。我发现这种编码很有趣。默认值将生成UTF7,而不是任何扩展ascii编码,如Windows-1251或Windows-1252。有人能给我一些启发吗?你有没有试过从.NET生成一个带有Unicode前导码的文件?它涉及到将字节数组与前导码和数据连接起来的混乱。如果你想写UTF7文件,你必须生成你自己的前导,因为UTF7Encoding没有实现GetPreamble()-它返回到Encoding.GetPreamble(),它返回一个空数组!UTF7的序言是一团混乱;不知怎的,它包含了第一个字符的前2位。我甚至不知道我是怎么开始解码的。。。