使用C#下载简单的空格分隔文件会产生垃圾字符

时间:2017-02-09 22:13:58

标签: c# encoding download filestream streamwriter

当尝试在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 文件源类型都会解码下载的数据。

1 个答案:

答案 0 :(得分:1)

试试这个:

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);
}

希望这有帮助!