2016-03-02 49 views
1

我有一个包含字母ø的文件。当我用这个代码File.ReadLines(filePath)从它读取时,我得到了一个问号而不是它。阅读文件时的C#编码

当我添加像这样的编码File.ReadLines(filePath, Encoding.GetEncoding(1252))我得到ø字符。

但默认编码已被设置为1252,财产Encoding.Default.CodePage返回1252

那么,为什么我必须指定编码为1252一边读书,当默认一个已被设置为1252

还有一个问题,如果文件是Unicode,C#会识别它的格式,或者我必须指定Unicode编码?

+1

File.ReadLines默认使用utf8进行编码 –

+1

使用传统的8位代码页编码(如1252)是上个世纪的做法。你只需要停止这样做,今天没有剩下的理由不使用utf-8。正如你发现的那样,File.ReadLines()默认为Encoding.UTF8。删除文件或使用文本编辑器重新保存文件。记事本已经足够好了,在SaveAs对话框上编码组合框。 –

+0

写入文件时是否也使用UTF-8默认值? – Aleksa

回答

2

原因是默认情况下,读取文本文件时使用的编码是UTF8。

Encoding.Default不是(尽管它的名字)在读取文件时使用的默认编码!

在我看来,Encoding.Default更好的名字应该是Encoding.UsingCurrentCodePage。 ;)

另请注意,与其使用File.ReadLines(filePath, Encoding.GetEncoding(1252)),您可以使用File.ReadLines(filePath, Encoding.Default)

如果您的代码尝试读取已在不同于1252的代码页中创建的文件,并且该代码页是运行代码的系统的当前代码页,那么您应该这样做。

您应该使用代码页的唯一原因是您正在读取或写入传统文件。

+0

写入文件时,UTF-8也是默认的吗? – Aleksa

+1

@Aleksa是的。这是现今档案的标准。 –

+0

经过大量测试后,我发现下面的代码更好用,而不是“Encoding.Default” var csvContent = System.IO.File.ReadAllText(import.File.LocalPath,Encoding.GetEncoding(“Windows-1252”)); – Ali