在读取文件之前,我是否必须检查ANSI编码?

时间:2012-09-20 12:34:57

标签: c# .net file encoding

我正在重新编写一些csv文件。文件非常简单,因为总是只有“; ”作为分隔符,并且没有'或类似的东西。

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

我刚才说,好吧!但是如果我考虑一下:在这种情况下我真的必须检查文件的编码吗?我刚刚将文件的编码更改为其他内容,我仍然可以毫无问题地读取文件。我的代码很简单:

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

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

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:1)

您可以在UTF-8编码下运行,因为UTF-8有一个很棒的属性支持 ASCII 字符,带有1字节(正如预期的那样),但是当它需要缩小以支持 Unicode

The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)