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
相关产品推荐
相关产品推荐

