当尝试在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 文件源类型都会解码下载的数据。
答案 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);
}
希望这有帮助!