0

我正在修改一些 csv 文件。这些文件真的很简单,因为总是只有 " ; " 作为分隔符,没有"'或类似的东西。

因此可以逐行读取文件并分隔字符串。那工作正常。现在人们告诉我:也许您应该检查文件的编码,它应该始终是 ANSI,如果不是,您的输出可能会有所不同和损坏。所以非ansi文件应该以某种方式标记。

我只是说,好吧!但如果我想一想:在这种情况下,我真的需要检查文件的编码吗?我只是将文件的编码更改为其他内容,我仍然能够毫无问题地读取文件。我的代码很简单:

using (TextReader reader = new StreamReader(myFileStream))
{
  while ((line = read.ReadLine()) != null)
  {
    //read the line, spererate by ; and other stuff...
  }
}

再说一遍:我真的需要检查文件的 ANSI 编码吗?有人可以给我一个例子,我什么时候会遇到麻烦,或者在读取非 ansi 文件后我什么时候会得到损坏的输出?谢谢!

4

2 回答 2

3

该特定构造函数StreamReader将假定数据是 UTF-8;与 ASCII 兼容,但如果数据使用 128-255 范围内的字节作为单字节代码页(您将在字符串中得到错误的字符等),则可能会失败,或者如果数据实际上是非常不同的东西,比如 UTF-7、UTF-32 等。

在某些情况下(少数),您可能可以使用字节顺序标记来检测编码,但这是一个循环问题:在大多数情况下,如果您还不知道编码,您就不能真正知道检测编码(稳健)。所以更好的方法是:首先知道编码。然后,您可以传入正确的编码以通过其他构造函数之一使用。

这是一个失败的例子:

// we'll write UTF-32, big-endian, without a byte-order-mark
File.WriteAllText("my.txt", "Hello world", new UTF32Encoding(true, false));

using (var reader = new StreamReader("my.txt"))
{
    string s = reader.ReadLine();
}
于 2012-09-20T12:39:51.337 回答
1

你可以在UTF-8encoding 下运行,因为UTF-8它有一个很棒的属性,支持带有字节的ASCII1字符(正如它所期望的那样),但是当它需要时,缩小以支持Unicode 字符

每个软件开发人员绝对、绝对必须了解 Unicode 和字符集的绝对最低要求(没有借口!)

于 2012-09-20T12:37:34.680 回答