使用 C# 下载一个简单的 space 分隔文件会产生乱码

Downloading a simple space delimited file with C# yields garbage characters

当尝试在 C# 中启动固定宽度文件的下载并使用记事本打开下载的文件时,内容完全是乱码。请参阅下面的示例。

????????\@@@@@@@@@@@@@@@@@@@@@@@@???????????????????@?????????@????????????@@???????@???????????????????@@@@@@@@@@@??@@@@??@?????????????@@@@@@@@@@@@@@@@?????@@@@@@@@@@@@@@??@@???????@??????????k?????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?????????????????????

这是我用来执行下载的代码。

char[] buffer = new char[2048];
using (var reader = new StreamReader(responseStream))
{
    using (var tw = new StreamWriter(DESTINATION + subFolder + files[files.Count - 1] + ".txt", false, Encoding.ASCII))
    {
        while (true)
        {
            int readCount = reader.Read(buffer, 0, buffer.Length);
            if (readCount == 0) break;
            tw.Write(buffer, 0, readCount);
        }
        responseStream.Close();
        tw.Close();
    }
}

我倾向于说和文件编码有关

我在 python 中编写了相同的下载程序,并且使用该代码可以按预期下载文件。我只是无法用 C# 解决它。

更新

下载的文本仍然是垃圾,但如果我使用 Microsoft Excel 导入数据 From Text 并将文件来源设置为 20924: IBM Latin-1 文本可读。在制作文件的下载过程中,是否有某种方式以编程方式执行此操作?

更新

任何 IBM 文件来源类型都会解码下载的数据。

试试这个:

StreamReader reader = new StreamReader(inputFilePath, Encoding.GetEncoding("IBM00924"));
using (reader = File.OpenText(inputFilePath))
{ ... }

如果您想尝试所有可用的编码以查看产生可读数据的方式,请使用 Encoding.GetEncodings() 方法遍历所有编码,如下所示:

foreach (var encoding in Encoding.GetEncodings())
{
    // Read raw
    var bytes = File.ReadAllBytes(inputFilePath);
    var converted = Encoding.Convert(encoding, Encoding.Utf8, bytes);
    File.WriteAllText(Path.Combine(Path.GetDirectoryName(outputFilePath), encoding.Name + ".txt") converted);
}

希望对您有所帮助!