【问题标题】:File.ReadAllText can't readFile.ReadAllText 无法读取
【发布时间】:2018-12-13 03:55:25
【问题描述】:

我的问题是我想解析一个文件,它必须检测一个特殊的字符 ('Â') 来做一些事情。我没有设法检测到它,但它适用于像“a”这样的普通字符。 所以我试图了解问题出在哪里,并创建了一个 .txt 文件,其唯一的字符是 'Â'。

string a = File.ReadAllText("C:/example/example/test.txt");
Console.WriteLine(a.Length);`

控制台打印 0。就像 char 不存在一样。所以我尝试了不同的编码(使用 utf8、utf16、unicode 等的 File.ReadAllText)并得到了相同的结果。

我真的不知道该怎么办,提前谢谢!

【问题讨论】:

  • 您的代码没有问题。你确定你读的是正确的文件吗?
  • 我会尝试一些 encoding 与此重载 File.ReadallText
  • 如果您确定您确实在读取正确的文本文件并且问题仍然存在,那么首先检查该文件的文件大小。如果文件大小不为零,则使用十六进制查看器/十六进制编辑器并查看文本文件中的字节。你看到了什么?
  • 请显示文件的二进制内容 - 如果你使用byte[] data = File.ReadAllBytes(...); 然后Console.WriteLine(BitConverter.ToString(data)); 那会显示什么?
  • 'Â' 字符相当特殊,您经常会在 utf-8 编码的文本文件中看到它。与其他重音 A 字符一样,0xC0 及以上是此类文件中的常见字节,当它以拉丁字母对文本进行编码时。在 StreamReader 应用了它的 Encoding 之后,它将不再是 'Â'。预期返回值 0,这样的字符需要超过 1 个字节来编码。所以你要做的第一件事就是确保你没有因为错误的原因寻找那个角色。

标签: c# file.readalllines


【解决方案1】:

您正在尝试读取 8859-1 编码的拉丁字符。试试下面

 Encoding iso = Encoding.GetEncoding("ISO-8859-1");
 string a = File.ReadAllText("C:/example/example/test.txt",iso);
 Console.WriteLine(a.Length);

【讨论】:

  • “您正在尝试读取 8859-1 编码的拉丁字符” - 相同的字符可以用多种编码表示。您无法仅从字符中判断正在使用哪种编码。
【解决方案2】:

如果您将编码设置为默认,它可以工作:

string result = File.ReadAllText("test.txt", Encoding.Default);

这会给你“”。

【讨论】:

  • 这并不能确保您将获得该字符。它仅将系统的默认编码设置应用于流将要读取的文件。
  • 我们没有任何信息表明 OP 的文件实际上使用了系统默认编码。
  • Encoding.Default 仅应在极少数情况下使用,通常应避免使用。这似乎可行,但是当您决定将此文件导出到另一个系统或从另一个系统导入文件时,您基本上已经破坏了代码,因为现在一切都取决于机会。
  • 没错,每个用户设置的默认值可能不同。
猜你喜欢
  • 2013-08-02
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
相关资源
最近更新 更多