如何在 C# 中读取 Little Endian 编码的文件?

How do I read Little Endian encoded files in C#?

我有一个来自 HttpWebResponse 的流,当我使用下面的代码读取并基本上在我的本地计算机上重新创建文件时。

string sx = "";
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    using (Stream resStream = response.GetResponseStream())
    {
        StreamReader reader = new StreamReader(resStream, Encoding.Default); // I have also tried using Encoding.UTF8/7/ASCII etc.
        sx = reader.ReadToEnd();
        // sourceItem.Name would have the file name along with the extension.
        using (StreamWriter sw = System.IO.File.AppendText(sourceItem.Name))
        {
            sw.Write(sx);
        }
    }
    response.Close();
}

但是当我在本地机器上打开文件时,我得到了所有奇怪的垃圾符号。

图片:

Garbage characters and symbols

我认为这是文件编码的问题。 我在 git bash 上使用 file * 来检查编码,结果是 Little Endian。 Little Endian Screenshot

但不幸的是,我在 System.Text.Encoding 中看不到 Little Endian。 我该如何解决我的问题?

感谢您的帮助。

How do I fix my problem?

您确定您的 http 端点 returns 是文本吗?我的猜测是,这个 returns 是一些二进制文件,而不是您期望的文本文件。如果你想直接将二进制响应写入文件,你可以这样做,如果我没记错的话:

using (Stream input = response.GetResponseStream())
using (Stream output = File.Open(sourceItem.Name, FileMode.Append))
{
    input.CopyTo(output);
}

我想知道你为什么要附加到文件中。如果你想“基本上 re-create 我本地机器上的文件”,我希望将完整的响应写成一个文件,会更好。喜欢:

using (Stream input = response.GetResponseStream())
using (Stream output = File.OpenWrite(sourceItem.Name))
{
    input.CopyTo(output);
}

如果这不是问题所在,我会按以下步骤进行处理:

  1. 是否可以在浏览器或其他类似Postman的http客户端发出请求?然后我会这样做以查看响应是否符合您的预期。
  2. 但如果第 1 步一切顺利,我会在 sx = reader.ReadToEnd(); 之后设置一个断点并检查 sx 以查看生成的字符串是否正确。如果不是,则需要尝试不同的编码。也许检查 Postman 中的 headers 或浏览器的调试工具,看看它们是否包含有关编码的提示。
  3. 如果您现在知道第 1 步和第 2 步是预期的,并且您像 AppendText 一样以 UTF-8 编码将字符串写入文件,但您的文件仍然没有正确显示,那么我会对文本提出质疑您使用的查看器 - 虽然对于无法正确处理 UTF-8 的文本查看器来说这似乎有点奇怪。