gpt4 book ai didi

.net - System.IO.File.ReadAllText 不会因无效编码而抛出异常

转载 作者:行者123 更新时间:2023-12-04 00:23:29 25 4
gpt4 key购买 nike

我在文件 utf8.txt 中有一些 UTF-8 文本。该文件包含一些超出 ASCII 范围的字符。我尝试了以下代码:

var fname = "utf8.txt";
var enc = Encoding.GetEncoding("ISO-8859-1", EncoderFallback.ExceptionFallback,
DecoderFallback.ExceptionFallback);
var s = System.IO.File.ReadAllText(fname, enc);

预期的行为是代码应该抛出异常,因为它不是有效的 ISO-8859-1 文本。相反,其行为是将 UTF-8 文本正确解码为正确的字符(在调试器中看起来是正确的)。

这是 .Net 中的错误吗?

编辑:

我最初测试的文件是带 BOM 的 UTF-8。如果我删除 BOM,行为就会改变。它仍然不会抛出异常,但是它会生成不正确的 Unicode 字符串(该字符串在调试器中看起来是正确的)。

编辑:

要生成我的测试文件,请运行以下代码:

var fname = "utf8.txt";
var utf8_bom_e_circumflex_bytes = new byte[] {0xEF, 0xBB, 0xBF, 0xC3, 0xAA};
System.IO.File.WriteAllBytes(fname, utf8_bom_e_circumflex_bytes);

编辑:

我认为我对正在发生的事情有坚定的把握(尽管我不同意 .Net 的部分行为)。

  • 如果文件以 UTF-8 BOM 开头,并且数据是有效的 UTF-8,则 ReadAllText 将完全忽略您传入的编码并(正确地)将文件解码为UTF-8。 (我还没有测试如果 BOM 是谎言并且文件不是真正的 UTF-8 会发生什么)我不同意这种行为。我认为 .Net 应该抛出异常或使用我给它的编码。

  • 如果文件没有 BOM,.Net 没有简单(并且 100% 可靠)的方法来确定文本不是真正的 ISO-8859-1,因为大多数(全部?)UTF-8 文本是也有效的 ISO-8859-1,尽管是乱码。所以它只是按照你的指示并用你给它的编码解码文件。 (我同意这种行为)

最佳答案

should throw an exception, since it is not valid ISO-8859-1 text

在 ISO-8859-1 中,所有可能的字节都映射到字符,因此将非 ISO-8859-1 文件读取为 ISO-8859-1 不会导致异常。

(是的,0x80–0x9F 范围内的所有字节都将变成您永远不想要的不可见控制代码,但它们仍然有效,只是无用。很多 ISO-8859 编码都是如此,它将 C1 控制代码放在 0x80–0x9F 范围内,但不是全部。您当然可以使用其他未映射字节的编码,例如 Windows-1252。)

If the file starts with UTF-8 BOM, and the data is valid UTF-8, then ReadAllText will completely ignore the encoding you passed in and (properly) decode the file as UTF-8.

是的。这在文档中有所暗示:

This method attempts to automatically detect the encoding of a file based on the presence of byte order marks.

我同意你的看法,这种行为非常愚蠢。我更喜欢 ReadAllBytes 并通过 Encoding.GetString 手动检查它。

关于.net - System.IO.File.ReadAllText 不会因无效编码而抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46006463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com