当前位置:  编程技术>.net/c#/asp.net

解析StreamReader与文件乱码问题的解决方法

    来源: 互联网  发布时间:2014-10-19

    本文导语:  相信很多人在读取文件的时候都会碰到乱码的情况,所谓乱码就是错乱的编码的意思,造成乱码的是由于编码不一致导致的。 演示程序: 新建3个文本文件: 编码和名字一样,分别是ansi,Unicode,utf8 里面的内容都是: ~!@#¥%...

相信很多人在读取文件的时候都会碰到乱码的情况,所谓乱码就是错乱的编码的意思,造成乱码的是由于编码不一致导致的。

演示程序:

新建3个文本文件:

编码和名字一样,分别是ansi,Unicode,utf8

里面的内容都是:

~!@#¥%……&*()

abcdefg

123456789

测试数据

 

读取这些文件的代码如下:

public static void Main()

{

    List lstFilePath = new List()

    {

        "H:\TestText\ansi.txt",

        "H:\TestText\unicode.txt",

        "H:\TestText\utf8.txt"

    };

    foreach (string filePath in lstFilePath)

    {

        using (StreamReader reader = new StreamReader(filePath))

        {

            Console.WriteLine("读取文件" + filePath);

            Console.WriteLine(reader.ReadToEnd());

            Console.WriteLine("************************************************************");

        }

    }

}

输出入下:

 

由于第一个文件使用ansi编码,但是StreamReader 的默认构造函数使用的是utf8编码,所以乱码了。

StreamReader 旨在以一种特定的编码输入字符,而 Stream 类用于字节的输入和输出。 使用 StreamReader 读取标准文本文件的各行信息。

除非另外指定, StreamReader 的默认编码为 UTF-8,而不是当前系统的 ANSI 代码页。 UTF-8 可以正确处理 Unicode 字符并在操作系统的本地化版本上提供一致的结果。

所以解决上面的编码问题的解决方案是使用StreamReader,并且传递Encoding.Default作为编码,一般在中文操作系统中,Encoding.Default是Gb2312编码。

public static void Main()

{

    List lstFilePath = new List()

    {

        "H:\TestText\ansi.txt",

        "H:\TestText\unicode.txt",

        "H:\TestText\utf8.txt"

    };

    foreach (string filePath in lstFilePath)

    {

        using (StreamReader reader = new StreamReader(filePath,Encoding.Default))

        {

            Console.WriteLine("读取文件" + filePath);

            Console.WriteLine(reader.ReadToEnd());

            Console.WriteLine("************************************************************");

        }

    }

}

输出如下:

从这里得到一个结论:使用StreamReader,并且使用Encoding.Default 作为编码。

很可惜,上面的这个结论在某些情况下页会存在问题,例如在你的操作系统中Encoding.Default 是Encoding.UTF8的时候。

最完美的解决方案是:文件使用什么编码保存的,就用什么编码来读取。

那如何得到文件的编码呢?

使用下面的代码就可以了:

代码如下:

public static Encoding GetEncoding(string filePath)
        {
            if (filePath == null)
            {
                throw new ArgumentNullException("filePath");
            }
            Encoding encoding1 = Encoding.Default;
            if (File.Exists(filePath))
            {
                try
                {
                    using (FileStream stream1 = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                    {
                        if (stream1.Length > 0)
                        {
                            using (StreamReader reader1 = new StreamReader(stream1, true))
                            {
                                char[] chArray1 = new char[1];
                                reader1.Read(chArray1, 0, 1);
                                encoding1 = reader1.CurrentEncoding;
                                reader1.BaseStream.Position = 0;
                                if (encoding1 == Encoding.UTF8)
                                {
                                    byte[] buffer1 = encoding1.GetPreamble();
                                    if (stream1.Length >= buffer1.Length)
                                    {
                                        byte[] buffer2 = new byte[buffer1.Length];
                                        stream1.Read(buffer2, 0, buffer2.Length);
                                        for (int num1 = 0; num1 < buffer2.Length; num1++)
                                        {
                                            if (buffer2[num1] != buffer1[num1])
                                            {
                                                encoding1 = Encoding.Default;
                                                break;
                                            }
                                        }
                                    }
                                    else
                                    {
                                        encoding1 = Encoding.Default;
                                    }
                                }
                            }
                        }
                    }
                }
                catch (Exception exception1)
                {
                    throw;
                }
                if (encoding1 == null)
                {
                    encoding1 = Encoding.UTF8;
                }
            }
            return encoding1;
        }

这段代码使用encoding1.GetPreamble()方法来得到编码的字节序列,然后重新读取数据,比较数据,如果不相同则说明是Encoding.Default.

否则是Encoding.Utf8.

有了GetEncoding(filename)方法后,可以将上面的读取代码修改如下:

public static void Main()

{

    List lstFilePath = new List()

    {

        "H:\TestText\ansi.txt",

        "H:\TestText\unicode.txt",

        "H:\TestText\utf8.txt"

    };

    foreach (string filePath in lstFilePath)

    {

        using (StreamReader reader = new StreamReader(filePath, GetEncoding(filePath)))

        {

            Console.WriteLine("读取文件" + filePath);

            Console.WriteLine(reader.ReadToEnd());

            Console.WriteLine("当前编码:" + reader.CurrentEncoding.EncodingName);

            Console.WriteLine("************************************************************");

        }

    }

}

输出如下:

从这里可以看到ansi 编码,Encoding.Default 就是简体中文(GB2312)


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 急!请问一个域名解析问题。很奇怪的。请忙解决一下
  • MySQL连接无法解析HOST主机名的解决方法
  • JAVA 里用XSL解析XML文档时中文问题的解决,请教各位!
  • android layout XML解析错误的解决方法
  • 请教:LINUX下有没有能象source insight那样解析并阅读代码的工具?解决问题50分相送!
  • JSP 不能解析EL表达式的解决办法
  • crawler4j抓取页面使用jsoup解析html时的解决方法
  • 解析在MySQL里创建外键时ERROR 1005的解决办法
  • IE6不能正常解析CSS文件问题的解决方法及原因分析
  • newtonsoft.json解析天气数据出错解决方法
  • 解析c#在未出现异常情况下查看当前调用堆栈的解决方法
  • 禁止mysql做域名解析(解决远程访问mysql时很慢)
  • VC++开发中完美解决头文件相互包含问题的方法解析
  • a2sd+状态下应用程序丢失的解决方法详细解析
  • 解析Android游戏中获取电话状态进行游戏暂停或继续的解决方法
  • error LNK2019: 无法解析的外部符号 问题的解决办法
  • HTML标签参考手册 iis7站长之家
  • java中使用sax解析xml的解决方法
  • c#中XML解析文件出错解决方法
  • 解析Silverlight调用WCF/Rest异常的解决方法
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • 请教redhat9下什么命令执行arp解析和逆向arp解析
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • 如何用libxml2 默认解析器解析HTML文件
  • 基于Python的Html/xml解析库Beautiful Soup 4.2.1发布
  • linux能否成为动态域名解析客户端的动态域名解析服务器?
  • html中<radio>单选按钮控件标签用法解析及如何设置默认选中
  • 配置DNS服务器后,服务器可解析,客户端不能解析。求解
  • Python下Html/xml解析库Beautiful Soup快速入门教程
  • 为什么我在使用nslookup命令的时候,正向解析(域名-》ip)没有问题,反向解析(ip-》域名)怎么查不到呢?
  • 基于Python的html解析库:pyquery最新版主页及pyquery下载


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3