2009-11-26 57 views
1

我想使用System.IO.File.ReadAllLines将文本文件读入一个字符串数组。但是,ReadAllLines删除了我想保留的文件中的一些奇数字符,例如chr(187)。我试过了一些不同的编码选项,但是这并没有帮助,我没有看到“不编码”的选项。如何读取文本文件而不会丢失奇怪的字符?

我可以使用FileOpen和LineInput无需修改即可读取文件,但速度相当慢。使用FileSystemObject也可以正常工作,但我宁愿不使用它。

什么是最好的方式来阅读一个文本文件到一个字符串数组而不用修改.net?

+0

你可以发布你现在怎么做的代码? – 2009-11-26 17:31:17

+0

请记住,“string”是“一系列字符”的数据类型。如果你想保留你的文件当前的确切方式,你应该使用一个字节数组。否则,你必须知道编码,才能给字节赋予一个可以用字符串表示的含义。 – Joey 2009-11-26 17:33:04

+0

由于不同的编码,请具体说明CHR(187)的字符是什么,您期待看到。例如,“正确指向双角引号”。那是你正在寻找的那个? – 2009-11-26 17:42:10

回答

6

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

当你说“chr(187)”你是什么Unicode字符?

一些编码,你可能会想尝试:

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

当我说chr(187)时,我的意思是该文件中该字节的值是187.我意识到它必须在Windows中转换为某个字符,并且我不关心那个字符是什么。但我希望能够将我字符串中的字符看作等于chr(187)的字符。现在,当我使用ReadAllLines和以上三种编码选项时,该字符缺失。 – xpda 2009-11-26 17:43:45

+0

我猜你想要的代码页是1252西欧('Encoding.GetEncoding(1252)')。你确定你完全错过了角色吗? 'ReadAllBytes(...,Encoding.GetEncoding(28591))''Encoding.Default'的大多数locales的值都会将每个字节转换为* some *字符或其他值(尽管在28591的情况下它将是一个控件字符),所以如果他们没有通过你在其他地方有问题。 – bobince 2009-11-26 17:57:06

+0

GetEncoding(1252)不会这样做。是的,这些字符被剥离出文件。如果我在WriteAllLines之后立即执行ReadAllLines,则输出文件将小于输入文件。 – xpda 2009-11-26 18:00:52

2

这听起来像你想读取原始字节。

使用File.ReadAllBytes将它们读入数组(不要对大文件执行此操作),或者使用FileStream一次读取字节块。

+0

我不想使用原始字节,因为我正在处理字符串数据。为此使用字节太慢且麻烦。我希望能够阅读一个文本文件,并确信我得到的整个文件没有缺失字符。 – xpda 2009-11-26 17:50:09

0

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

如果我在问题中解释过奇怪的字符是在文件开头,我想我会得到一个快速的答案。我会给乔恩Skeet信贷为我提出的问题的最佳答案。

相关问题