[.Net/C# 团队]2000人开发交流Qq群:348041382

架构师_程序员

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 90|回复: 2

[已解决] StreamReader读取文件时出现乱码的解决方案

[复制链接]
发表于 7 天前 | 显示全部楼层 |阅读模式
今天在做一个打开文件对话框OpenFileDialog时,需要对打开的文件进行读取,显示在在窗体中的RichTextBox中。但是在显示文件时,却发现显示的中文字符串出现乱码。代码的关键部分如下所示:
  1. StreamReader sr = new StreamReader(openFileDialog.OpenFile());               
  2. string str = sr.ReadToEnd();
  3. childForm.richTextBox1.Text = str;
复制代码
开始我也想到了是字符编码出了问题,于是我在初始化StreamReader时,给它加了字符编码参数,加了好几次,Encoding.Unicode,Encoding.UTF32,Encoding.UTF7,Encoding.UTF8,Encoding.ASCII,这些能加的编码方案我都试过了,结果都不行。


原来自从Windows 2000之后的操作系统在文件处理时默认编码采用Unicode,所以.Net 的文件默认编码也是Unicode。除非另外指定,StreamReader 的默认编码为 Unicode,而不是当前系统的 ANSI 代码页。但是文档大部分还是以ANSI编码储存,中文文本使用的是gb2312,所以才造成中文乱码的状况,也就是说在读取文本的时候要指定编码格式。


解决方法是:System.Text.Encoding.Default 告诉 StreamReader 目前操作系统的编码即可。
  1. StreamReader sr = new StreamReader(openFileDialog.OpenFile(), Encoding.Default);               
  2. string str = sr.ReadToEnd();
  3. childForm.richTextBox1.Text = str;
复制代码





上一篇:.net/c# Xml,Json,Hessian,Protocol Buffers序列化对比
下一篇:.net/c# 使用Costura.Fody将DLL打包到EXE中
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 7 天前 | 显示全部楼层
本帖最后由 QWERTYU 于 2018-4-13 17:18 编辑

如果还是不行,可能是服务端对数据进行了压缩,以gzip为例,需要对数据先进行解压操作。
  1. using(GZipStream stream = new GZipStream(response.GetResponseStream(),CompressionMode.Decompress)){using (StreamReader reader = new StreamReader(stream,Encoding.Default)){string aa=reader.ReadToEnd();}}
复制代码

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 昨天 13:31 | 显示全部楼层
如果网页内容是用gzip压缩的,获取内容为乱码,解决办法有两种

第一种解决办法:

//
        // 摘要:
        //     获取或设置所使用的解压缩类型。
        //
        // 返回结果:
        //     一个 T:System.Net.DecompressionMethods 对象,该对象指示所使用的解压缩类型。
        //
        // 异常:
        //   T:System.InvalidOperationException:
        //     对象的当前状态不允许设置此属性。
        public DecompressionMethods AutomaticDecompression { get; set; }
下面一行代码就搞定,改动很小!!!

  1. request.AutomaticDecompression = DecompressionMethods.GZip;
复制代码
  1. string sHTML = string.Empty;
  2.                 using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
  3.                 {
  4.                     using (Stream myResponseStream = response.GetResponseStream())
  5.                     {
  6.                         StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
  7.                         sHTML = myStreamReader.ReadToEnd();
  8.                     }
  9.                 }
  10.                 return sHTML;
复制代码



第二种解决办法:

  1. string sHTML = string.Empty;
  2.                 using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
  3.                 {
  4.                     using (GZipStream stream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress))
  5.                     {
  6.                         using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
  7.                         {
  8.                             sHTML = reader.ReadToEnd();
  9.                         }
  10.                     }
  11.                 }
  12.                 return sHTML;
复制代码


码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

Mail To:help@itsvse.com

QQ|Archiver|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )

GMT+8, 2018-4-20 11:03

Powered by Discuz! X3.4

© 2001-2014 Comsenz Inc.

快速回复 返回顶部 返回列表