【问题标题】:How do you read a text file without losing odd characters?如何在不丢失奇数字符的情况下读取文本文件?
【发布时间】:2009-11-26 17:29:29
【问题描述】:

我想使用 System.IO.File.ReadAllLines 将文本文件读入字符串数组。但是,ReadAllLines 会删除文件中我想保留的一些奇怪字符,例如 chr(187)。我尝试了一些不同的编码选项,但这无济于事,而且我没有看到“无编码”选项。

我可以使用 FileOpen 和 LineInput 来读取文件而无需修改,但这有点慢。使用 FileSystemObject 也可以正常工作,但我不想使用它。

在.net中将文本文件读入字符串数组而不进行修改的最佳方法是什么?

【问题讨论】:

  • 你能发布你现在如何做的代码吗?
  • 请记住,string 是“一系列字符”的数据类型。如果您想保留文件当前外观的确切方式,您可能应该使用字节数组。否则,您必须知道编码才能赋予字节可以在字符串中表示的含义。
  • 由于编码不同,请具体说明您希望看到的 CHR(187) 字符。例如,“右指向双角引号”。是你要找的那个吗?
  • 现在我正在使用 ss = File.ReadAllLines(infile, System.Text.Encoding.default)。我意识到我可以使用字节数组,但我更喜欢使用字符串,因为我处理字符串。更重要的是,当我阅读一个文件时,我想确保我得到了所有文件,没有删除一些字符。
  • 那么你实际上想要的是字节,而不是字符。看我的回答。

标签: .net vb.net file text encoding


【解决方案1】:

没有“无编码”这样的概念。你必须找出正确的编码,否则你不可能正确解释数据。

当您说“chr(187)”时,您指的是什么 Unicode 字符?

您可能想尝试的一些编码:

  • Encoding.Default - 系统默认编码
  • Encoding.GetEncoding(28591) - ISO-Latin-1
  • Encoding.UTF8 - 在现代文件中很常见

【讨论】:

  • 当我说 chr(187) 时,我的意思是文件中那个字节的值是 187。我意识到它必须转换为 Windows 中的某个字符,我不在乎那是哪个角色。但我希望能够将我的字符串中的那个字符视为等于 chr(187) 的字符。现在,当我使用 ReadAllLines 和上述三个编码选项中的任何一个时,该字符丢失了。
  • 我猜你想要的代码页是 1252 西欧 (Encoding.GetEncoding(1252))。您确定您完全“缺少”角色吗? ReadAllBytes(..., Encoding.GetEncoding(28591)) 以及大多数语言环境的 Encoding.Default 值会将每个字节转换为 some 字符或其他字符(尽管在 28591 的情况下它将是控制字符),所以如果它们不是让它通过你在其他地方有问题。
  • GetEncoding(1252) 不这样做。是的,字符已从文件中删除。如果我在 WriteAllLines 之后立即执行 ReadAllLines,则输出文件小于输入文件。
【解决方案2】:

听起来您想读取原始字节。

使用File.ReadAllBytes 将它们读入一个数组(不要对大文件这样做),或者使用FileStream 一次读取字节块。

【讨论】:

  • 我不想使用原始字节,因为我正在处理字符串数据。为此使用字节太慢且太麻烦。我希望能够读取一个文本文件,并确信我得到的整个文件没有丢失任何字符。
【解决方案3】:

被删除的字符位于文件的开头。事实证明,它们是 UTF-8 的字节顺序标记。 File.ReadAllLines 和 File.ReadAllText 去除了字节顺序标记,而 LineInput 和 FileSystemObject 函数没有。

如果我在问题中解释了奇数字符位于文件开头,我想我会得到一个快速的答案。我将把对我提出的问题的最佳答案归功于 Jon Skeet。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2011-03-27
    • 2014-06-05
    • 2018-05-25
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多