最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解析StreamReader與文件亂碼問(wèn)題的解決方法

 更新時(shí)間:2013年05月13日 12:14:14   作者:  
本篇文章是對(duì)StreamReader與文件亂碼問(wèn)題的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下

相信很多人在讀取文件的時(shí)候都會(huì)碰到亂碼的情況,所謂亂碼就是錯(cuò)亂的編碼的意思,造成亂碼的是由于編碼不一致導(dǎo)致的。

演示程序:

新建3個(gè)文本文件:

clip_image002

編碼和名字一樣,分別是ansi,Unicode,utf8

里面的內(nèi)容都是:

~!@#%……&*()

abcdefg

123456789

測(cè)試數(shù)據(jù)

clip_image004

clip_image006

clip_image008

 

讀取這些文件的代碼如下:

public static void Main()

{

    List<string> lstFilePath = new List<string>()

    {

        "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("************************************************************");

        }

    }

}

輸出入下:

clip_image010

 

由于第一個(gè)文件使用ansi編碼,但是StreamReader 的默認(rèn)構(gòu)造函數(shù)使用的是utf8編碼,所以亂碼了。

StreamReader 旨在以一種特定的編碼輸入字符,而 Stream 類(lèi)用于字節(jié)的輸入和輸出。 使用 StreamReader 讀取標(biāo)準(zhǔn)文本文件的各行信息。

除非另外指定, StreamReader 的默認(rèn)編碼為 UTF-8,而不是當(dāng)前系統(tǒng)的 ANSI 代碼頁(yè)。 UTF-8 可以正確處理 Unicode 字符并在操作系統(tǒng)的本地化版本上提供一致的結(jié)果。

所以解決上面的編碼問(wèn)題的解決方案是使用StreamReader,并且傳遞Encoding.Default作為編碼,一般在中文操作系統(tǒng)中,Encoding.Default是Gb2312編碼。

public static void Main()

{

    List<string> lstFilePath = new List<string>()

    {

        "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("************************************************************");

        }

    }

}

輸出如下:

clip_image012

從這里得到一個(gè)結(jié)論:使用StreamReader,并且使用Encoding.Default 作為編碼。

很可惜,上面的這個(gè)結(jié)論在某些情況下頁(yè)會(huì)存在問(wèn)題,例如在你的操作系統(tǒng)中Encoding.Default Encoding.UTF8的時(shí)候。

最完美的解決方案是:文件使用什么編碼保存的,就用什么編碼來(lái)讀取。

那如何得到文件的編碼呢?

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

復(fù)制代碼 代碼如下:

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()方法來(lái)得到編碼的字節(jié)序列,然后重新讀取數(shù)據(jù),比較數(shù)據(jù),如果不相同則說(shuō)明是Encoding.Default.

否則是Encoding.Utf8.

有了GetEncoding(filename)方法后,可以將上面的讀取代碼修改如下:

public static void Main()

{

    List<string> lstFilePath = new List<string>()

    {

        "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("當(dāng)前編碼:" + reader.CurrentEncoding.EncodingName);

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

        }

    }

}

輸出如下:

clip_image002

從這里可以看到ansi 編碼,Encoding.Default 就是簡(jiǎn)體中文(GB2312)

相關(guān)文章

  • C#使用第三方組件生成二維碼匯總

    C#使用第三方組件生成二維碼匯總

    本文給大家匯總了幾種C#使用第三方組件生成二維碼的方法以及示例,非常的簡(jiǎn)單實(shí)用,都是項(xiàng)目中經(jīng)常需要用到的,希望大家能夠喜歡
    2016-12-12
  • C#難點(diǎn)逐個(gè)擊破(8):可空類(lèi)型System.Nullable

    C#難點(diǎn)逐個(gè)擊破(8):可空類(lèi)型System.Nullable

    null值用來(lái)表示數(shù)據(jù)類(lèi)型未被賦予任何值,它是一種引用類(lèi)型;void表示沒(méi)有類(lèi)型,或者說(shuō)是沒(méi)有任何值。null與void的區(qū)別可以認(rèn)為void是根本沒(méi)有,而null是一個(gè)空箱子,里面什么都沒(méi)有。
    2010-02-02
  • C#圖片處理3種高級(jí)應(yīng)用

    C#圖片處理3種高級(jí)應(yīng)用

    本文介紹C#圖片處理高級(jí)應(yīng)用,這些功能并無(wú)多大技術(shù)含量。全部基于.Net Framework類(lèi)庫(kù)完成,代碼中包含了C#圖片處理的一些基礎(chǔ)知識(shí),與大家分享,個(gè)人能力有限,不足之處還請(qǐng)及時(shí)指正。
    2015-10-10
  • C# 7.0 使用下劃線忽略使用的變量的原因分析

    C# 7.0 使用下劃線忽略使用的變量的原因分析

    這篇文章主要介紹了C# 7.0 使用下劃線忽略使用的變量的原因淺析,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-10-10
  • webBrowser執(zhí)行js的方法,并返回值,c#后臺(tái)取值的實(shí)現(xiàn)

    webBrowser執(zhí)行js的方法,并返回值,c#后臺(tái)取值的實(shí)現(xiàn)

    下面小編就為大家?guī)?lái)一篇webBrowser執(zhí)行js的方法,并返回值,c#后臺(tái)取值的實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • C#入門(mén)教程之集合ArrayList用法詳解

    C#入門(mén)教程之集合ArrayList用法詳解

    這篇文章主要介紹了C#入門(mén)教程之集合ArrayList用法,結(jié)合具體實(shí)例分析了C#中集合的概念、功能、創(chuàng)建與使用方法,需要的朋友可以參考下
    2017-06-06
  • C#以太網(wǎng)Sockets客戶(hù)端設(shè)計(jì)實(shí)現(xiàn)

    C#以太網(wǎng)Sockets客戶(hù)端設(shè)計(jì)實(shí)現(xiàn)

    本文主要介紹了C#以太網(wǎng)Sockets客戶(hù)端設(shè)計(jì)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 基于C#實(shí)現(xiàn)圖片合成功能

    基于C#實(shí)現(xiàn)圖片合成功能

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)圖片合成的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • C#語(yǔ)言主要特性總結(jié)

    C#語(yǔ)言主要特性總結(jié)

    這篇文章主要介紹了C#語(yǔ)言主要特性總結(jié),本文總結(jié)了C#語(yǔ)言的簡(jiǎn)單、現(xiàn)代、面向?qū)ο?、?lèi)型安全、相互兼容性、可伸縮性和可升級(jí)性等幾個(gè)主要特點(diǎn),需要的朋友可以參考下
    2015-02-02
  • Unity3D實(shí)現(xiàn)物體旋轉(zhuǎn)縮放移動(dòng)效果

    Unity3D實(shí)現(xiàn)物體旋轉(zhuǎn)縮放移動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了Unity3D實(shí)現(xiàn)物體旋轉(zhuǎn)縮放移動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02

最新評(píng)論

库伦旗| 安岳县| 海淀区| 河北省| 德昌县| 讷河市| 汉寿县| 霍邱县| 阳谷县| 渑池县| 黎川县| 岑巩县| 轮台县| 黄骅市| 轮台县| 吉水县| 林口县| 多伦县| 汉寿县| 鹤庆县| 竹山县| 科技| 万州区| 德昌县| 怀来县| 普定县| 崇义县| 青海省| 安达市| 南澳县| 静宁县| 南丰县| 双城市| 高要市| 措美县| 股票| 额尔古纳市| 岑溪市| 普陀区| 大悟县| 沁阳市|