You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何读取Little Endian编码文件 解决流存本地乱码问题

问题根因

乱码核心原因不是编码选择错误,是流读写逻辑从根本上用错了:

  • StreamReader/StreamWriter仅适用于纯文本内容读写,操作时会自动做编码转码。如果你下载的是二进制文件(图片、压缩包、可执行程序、Office文档等非纯文本格式),转码过程会直接破坏原始字节数据,最终生成的文件必然损坏,和你试的Default/UTF-8/ASCII哪种编码没有关系。
  • 你检测到的Little Endian编码就是UTF-16LE,对应System.Text.Encoding.Unicode,但就算手动指定这个编码,只要下载内容是非文本格式,依然会出现乱码损坏。
  • 额外注意:你原代码用File.AppendText是追加写入模式,如果本地已经存在同名损坏文件,新内容会直接拼在坏文件后面,哪怕后续逻辑正确也会得到异常文件。
正确修复方案

直接做原始字节拷贝,全程跳过文本编码转换逻辑,不要用文本读写类处理下载流:

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    using (Stream resStream = response.GetResponseStream())
    {
        // 用覆盖模式创建本地文件流,避免旧文件内容干扰
        using (FileStream fs = new FileStream(sourceItem.Name, FileMode.Create, FileAccess.Write))
        {
            // 8KB缓冲区做流拷贝,平衡内存占用和读写效率
            byte[] buffer = new byte[8192];
            int readLength;
            while ((readLength = resStream.Read(buffer, 0, buffer.Length)) > 0)
            {
                fs.Write(buffer, 0, readLength);
            }
        }
    }
}

如果用的是.NET Framework 4.0及以上版本,流拷贝可以直接用内置方法简化代码,不用手动写缓冲区循环:

resStream.CopyTo(fs);
纯文本场景的特殊处理

如果你确认下载的是纯文本文件,不需要做字节拷贝,也不要猜测编码,直接从响应头拿服务端标注的真实编码即可:

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    // 从响应头获取字符集,默认兜底用UTF-8
    Encoding respEncoding = Encoding.GetEncoding(response.CharacterSet ?? "utf-8");
    using (Stream resStream = response.GetResponseStream())
    using (StreamReader reader = new StreamReader(resStream, respEncoding))
    {
        string content = reader.ReadToEnd();
        // 写入时指定和源文件一致的编码,不要用AppendText的默认UTF-8配置
        File.WriteAllText(sourceItem.Name, content, respEncoding);
    }
}

内容的提问来源于stack exchange,提问作者Puneeth C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 02:54:40