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ÁŸ!每£

有人认出那个编码吗?

utf8-在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
}