utf8-在C#中解析一个以制表符分隔的文件
本文关键字:制表符 分隔 文件 一个以 utf8- | 更新日期: 2023-09-27 18:00:59
B"H
我有一个应该用制表符分隔的文件。Excel打开它很好,没有问题。但当我尝试File.ReadAllText((时,我无法获得一个像样的表示。我能做的最好的事情是使用UTF8,它返回了大部分数据,但第一行都搞砸了,文档其余部分的一些选项卡也不见了。
以下是使用UTF8读取时的第一行:�''u0010''b''u0004c''u0004''0''0�''u0006�''u0003''0''0''0''0!�A''u0004''0''0''0''0''0 ''0''001''0''0''0ID''0''0''0%0''0''0''0''u0006''0''0''0''0''0''0''0''0''0''0''00''0''0''0名称''0''0''0''x0''0''0''00''0''00''0C''0''0''0''''u001e''0''0''0'' 0''0''0''0''0C''0''0''0(''0''0''0''0''0((''0''0''0''0''0 ''0''0''0''0L''0''0''0''u0001''0''0''0''0
以下是在记事本中打开时显示的前几个字节:õcÁŸ!每£
有人认出那个编码吗?
首先,让我们检查是否存在与编码相关的问题,这是纯文本文件的祸根。使用Microsoft Word或Notepad++可以通过预览每个编码来发现编码。
在Microsoft Word中,转到菜单的"选项"、"高级"、"常规"小节,并在"打开时确认文件格式转换"旁边选中。完成后,单击"确定"按钮。然后,在Microsoft Word中打开该文件。预览每个编码,直到找到一个能正确显示所有内容的编码。
找到编码后,使用.NETFramework的StreamReader
类打开具有该编码的文件。
到目前为止,这种获取文件编码的方式对我来说很好。
http://weblog.west-wind.com/posts/2007/Nov/28/Detecting-Text-Encoding-for-StreamReader
/// <summary>
/// Detects the byte order mark of a file and returns
/// http://weblog.west-wind.com/posts/2007/Nov/28/Detecting-Text-Encoding-for-StreamReader
/// an appropriate encoding for the file.
/// </summary>
/// <param name="srcFile"></param>
/// <returns></returns>
public static Encoding GetFileEncoding(string srcFile)
{
// *** Use Default of Encoding.Default (Ansi CodePage)
Encoding enc = Encoding.Default;
// *** Detect byte order mark if any - otherwise assume default
byte[] buffer = new byte[5];
FileStream file = new FileStream(srcFile, FileMode.Open);
file.Read(buffer, 0, 5);
file.Close();
if (buffer[0] == 0xef && buffer[1] == 0xbb && buffer[2] == 0xbf)
enc = Encoding.UTF8;
else if (buffer[0] == 0xfe && buffer[1] == 0xff)
enc = Encoding.Unicode;
else if (buffer[0] == 0 && buffer[1] == 0 && buffer[2] == 0xfe && buffer[3] == 0xff)
enc = Encoding.UTF32;
else if (buffer[0] == 0x2b && buffer[1] == 0x2f && buffer[2] == 0x76)
enc = Encoding.UTF7;
return enc;
}
我像这个一样使用它
//To read
Encoding currentFileEnc = GetFileEncoding(TheFile);
using (StreamReader sr = new StreamReader(TheFile, currentFileEnc))
{
//Blah blah blah
}
//To write back
using (StreamWriter sw = new StreamWriter(TempFilePath, false, currentFileEnc))
{
//blah blah blah
}