Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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
.net 编码。默认值与File.ReadAllText中的无编码不同?_.net_Encoding_File Io - Fatal编程技术网

.net 编码。默认值与File.ReadAllText中的无编码不同?

.net 编码。默认值与File.ReadAllText中的无编码不同?,.net,encoding,file-io,.net,Encoding,File Io,(如果这是个骗局,很抱歉) 我刚刚花了很长时间试图正确读取文本文件 从File.ReadAllText(path)开始,我尝试了File.ReadAllText(path,Encoding)的几种变体,之后我陷入了分析输入文件以找出哪个字节是问题所在的困境,等等 在绝望中,我尝试了File.ReadAllText(path,Encoding.Default),效果很好 我现在很难理解,如果指定默认值,为什么默认值显然只是默认值 (我缩减的测试字符串是+4433ç,我将其保存在记事本中作为ANSI

(如果这是个骗局,很抱歉)

我刚刚花了很长时间试图正确读取文本文件

File.ReadAllText(path)
开始,我尝试了
File.ReadAllText(path,Encoding)
的几种变体,之后我陷入了分析输入文件以找出哪个字节是问题所在的困境,等等

在绝望中,我尝试了
File.ReadAllText(path,Encoding.Default)
,效果很好

我现在很难理解,如果指定默认值,为什么默认值显然只是默认值


(我缩减的测试字符串是
+4433ç
,我将其保存在记事本中作为ANSI-尽管使用瑞士-法国地区设置…

编码。默认值是系统的ANSI代码页

如果未指定编码,File.ReadAllText将执行以下操作:

  • 首先,它检查是否有字节顺序标记(UTF-8、UTF-16或UTF-32)。如果存在,则使用字节顺序标记中指定的编码
  • 否则,它使用UTF-8

因此,获取系统ANSI代码页的唯一方法是显式指定Encoding.Default。

来自MSDN,关于字符串ReadAllText(字符串路径)重载:

此方法尝试自动检测文件的编码


因此,不,这与使用默认编码不同。UTF8是真正的默认编码,仅在自动检测未找到任何编码时使用。所以BOM更重要。详情如下:

ReadAllText(字符串路径)
-MSDN:“此方法尝试自动检测编码”

ReadAllText(字符串路径,编码)
-MSDN:“此方法尝试自动检测编码”

从反射器工具:
ReadAllText(path)
ReadAllText(path,Encoding.UTF8)
相同,因为
ReadAllText(path)
只调用
ReadAllText(path,Encoding.UTF8)
。这两种方法都以这种方式创建StreamReader:

public StreamReader(string path, Encoding encoding) : this(path, encoding, true, 0x400)
{
}
这意味着它创建
StreamReader(字符串路径、编码、bool detectEncodingFromByteOrderMarks、int bufferSize)
,detectEncodingFromByteOrderMarks设置为true。这意味着,如果存在字节顺序标记(BOM),则它将使用BOM中的编码,如果BOM不存在,则它将使用提供的编码。如果BOM不存在且未提供编码,则将使用UTF8。因此,在这种情况下,UTF8是真正的默认值,但请记住,BOM比建议的编码更重要

// bom.txt is the file with BOM present. nobom.txt - witout BOM
File.ReadAllText("bom.txt");                     // use BOM
File.ReadAllText("bom.txt", Encoding.UTF8);      // use BOM
File.ReadAllText("bom.txt", Encoding.Default);   // use BOM
File.ReadAllText("nobom.txt");                   // use UTF-8
File.ReadAllText("nobom.txt", Encoding.UTF8);    // use UTF-8
File.ReadAllText("nobom.txt", Encoding.Default); // use system's ANSI codepage

请注意,Encoding.Default不应被视为“默认”编码-它是系统默认codepage.File.ReadAllText的(非unicode!)编码,不检查字节顺序标记。如果不指定编码,它将始终使用UTF-8。Reflector和.NET参考源都证实了这一点。Jivko,我认为你的评论不正确。没有编码的ReadAllText调用ReadAllText(路径,encoding.UTF8),但ReadAllText使用的内部流将读取BOM(如果存在),并用检测到的编码替换encoding.UTF8。这是因为在StreamReader构造函数中detectEncodingFromByteOrderMarks被设置为true。您知道是否有方法覆盖BOM,从而使Encoding.whatever成为优先级吗?@DanW,您可以尝试使用
new StreamReader(“brokenFile.txt”,Encoding.whatever,false)
。但在这种情况下,它可能会将BOM表视为文本-因此您会在开始处看到奇怪的字符。确保您正在做什么,因为在设置BOM表时,它通常是正确设置的。