我一直在开发一个winform系统。并且需要读取txt文件。
不幸的是,有许多txt编码文件。我无法使用特定的编码来阅读它。
问题是如何判断txt文件编码。
答案 0 :(得分:2)
在这里看到这个答案:
How can I detect the encoding/codepage of a text file
您无法检测代码页,需要告知它。您可以分析字节并猜测它,但这可能会产生一些奇怪的(有时是有趣的)结果。我现在找不到它,但我确信记事本可以用中文显示英文文本。
及其链接的文章:
http://www.joelonsoftware.com/printerFriendly/articles/Unicode.html
关于编码的最重要事实
如果你完全忘记了我刚才解释的一切,请记住一个非常重要的事实。在不知道它使用什么编码的情况下拥有字符串是没有意义的。你不能再把头埋在沙子里,假装“普通”文字是ASCII。没有像纯文本那样的东西。
如果您有字符串,内存,文件或电子邮件消息,则必须知道它所使用的编码,或者您无法解释它或正确地将其显示给用户。
答案 1 :(得分:2)
在@Gens和@Samuel Neff提示中,我解决了这个问题。 这是我的代码。
public static Encoding GetFileEncoding(string srcFile)
{
// *** Use Default of Encoding.Default (Ansi CodePage)
Encoding encoding = Encoding.Default;
using (FileStream stream = File.OpenRead(fileName))
{
// *** Detect byte order mark if any - otherwise assume default
byte[] buff = new byte[5];
stream.Read(buff, 0, buff.Length);
if (buff[0] == 0xEF && buff[1] == 0xBB && buff[2] == 0xBF)
{
encoding = Encoding.UTF8;
}
else if (buff[0] == 0xFE && buff[1] == 0xFF)
{
encoding = Encoding.BigEndianUnicode;
}
else if (buff[0] == 0xFF && buff[1] == 0xFE)
{
encoding = Encoding.Unicode;
}
else if (buff[0] == 0 && buff[1] == 0 && buff[2] == 0xFE && buff[3] == 0xFF)
{
encoding = Encoding.UTF32;
}
else if (buff[0] == 0x2B && buff[1] == 0x2F && buff[2] == 0x76)
{
encoding = Encoding.UTF7;
}
}
return encoding;
}