我正在重新编写一些csv文件。文件非常简单,因为总是只有“; ”作为分隔符,并且没有“,'或类似的东西。
因此可以逐行读取文件并分离字符串。多数民众赞成工作。现在人们告诉我:也许你应该检查文件的编码,它应该始终是ANSI,如果它不可能你的输出会不同和损坏。所以非ansi文件应该以某种方式标记。
我刚才说,好吧!但是如果我考虑一下:在这种情况下我真的必须检查文件的编码吗?我刚刚将文件的编码更改为其他内容,我仍然可以毫无问题地读取文件。我的代码很简单:using (TextReader reader = new StreamReader(myFileStream))
{
while ((line = read.ReadLine()) != null)
{
//read the line, spererate by ; and other stuff...
}
}
再次:我真的需要检查ANSI编码的文件吗?有人能给我一个例子,我什么时候可以遇到麻烦,或者在读取非ansi文件后何时出现损坏的输出?谢谢!
答案 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 。