亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

解析StreamReader與文件亂碼問題的解決方法

2020-01-24 03:21:37
字體:
來源:轉載
供稿:網友

相信很多人在讀取文件的時候都會碰到亂碼的情況,所謂亂碼就是錯亂的編碼的意思,造成亂碼的是由于編碼不一致導致的。

演示程序:

新建3個文本文件:

clip_image002

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

里面的內容都是:

~@#%……&*()

abcdefg

123456789

測試數據

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

 

由于第一個文件使用ansi編碼,但是StreamReader 的默認構造函數使用的是utf8編碼,所以亂碼了。

StreamReader 旨在以一種特定的編碼輸入字符,而 Stream 類用于字節的輸入和輸出。 使用 StreamReader 讀取標準文本文件的各行信息。

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

所以解決上面的編碼問題的解決方案是使用StreamReader,并且傳遞Encoding.Default作為編碼,一般在中文操作系統中,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

從這里得到一個結論:使用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<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("當前編碼:" + reader.CurrentEncoding.EncodingName);

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

        }

    }

}

輸出如下:

clip_image002

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久成人18免费网站| 久久亚洲国产成人| 国产国语刺激对白av不卡| 亚洲国产私拍精品国模在线观看| 久久精品一偷一偷国产| 久久久久久一区二区三区| 91av在线影院| 亚洲精品久久久久国产| 精品国产欧美一区二区五十路| 日韩成人av网| 国产91九色视频| 国产精品久久久久久久久久ktv| 亚洲国产私拍精品国模在线观看| 91精品国产色综合久久不卡98| 中文国产亚洲喷潮| 日韩中文字在线| 欧美性极品少妇精品网站| 久久综合国产精品台湾中文娱乐网| 日韩精品免费在线视频| 亚洲精品aⅴ中文字幕乱码| 欧美一区二粉嫩精品国产一线天| 日韩欧美成人精品| 亚洲曰本av电影| 亚洲综合精品伊人久久| 69av在线播放| 两个人的视频www国产精品| 国产精品色午夜在线观看| 欧美黑人xxxx| 超碰精品一区二区三区乱码| 久久九九免费视频| 亚洲精品久久久久中文字幕欢迎你| 97在线视频精品| 国产福利精品在线| 精品夜色国产国偷在线| 日韩美女在线观看一区| 日韩在线视频国产| 国产日韩欧美电影在线观看| 一区二区成人精品| 国产精品69av| 日本久久中文字幕| 亚洲福利在线播放| 日韩在线视频二区| 91精品国产高清久久久久久久久| 国产精品爱啪在线线免费观看| 亚洲欧美精品在线| 国产精品视频一区国模私拍| 青青久久av北条麻妃海外网| 日韩美女av在线免费观看| 岛国视频午夜一区免费在线观看| 国产精品欧美日韩一区二区| 亚洲自拍小视频免费观看| 欧美性猛交视频| 国产精品最新在线观看| 亚洲欧美国产精品| 亚洲社区在线观看| 日韩在线欧美在线| 亚洲图片制服诱惑| 欧美日韩成人在线播放| 亚洲天堂av网| 色婷婷综合久久久久中文字幕1| 日产日韩在线亚洲欧美| 97超碰国产精品女人人人爽| 亚洲第一男人av| 国产精品久久久久久久久久| 日韩在线激情视频| 久久久久久久久久久av| 亚洲free性xxxx护士白浆| 欧美乱人伦中文字幕在线| 亚洲剧情一区二区| 国产日韩欧美日韩大片| 精品亚洲va在线va天堂资源站| 欧美午夜精品久久久久久久| 国产色婷婷国产综合在线理论片a| 97在线视频精品| www日韩中文字幕在线看| 国产亚洲一区二区精品| 国产精品一区二区久久久| 国产精品7m视频| 91欧美日韩一区| 久久久伊人欧美| 欧美精品激情在线| 日韩美女在线观看| 日韩在线观看av| 日韩中文字幕在线观看| 国产91露脸中文字幕在线| 久久精品视频亚洲| 在线精品视频视频中文字幕| 成人www视频在线观看| 国产精品视频在线播放| 亚洲视屏在线播放| 亚洲国产日韩欧美在线图片| 成人精品久久一区二区三区| 久久亚洲精品一区| 尤物tv国产一区| 国产精品老牛影院在线观看| 欧美日韩国产一区在线| 欧美性在线视频| 精品国产精品自拍| 福利视频一区二区| 欧美在线观看网址综合| 亚洲欧美日韩精品久久奇米色影视| 亚洲欧美制服中文字幕| 日韩av在线免费观看一区| 亚洲www在线| 亚洲第一精品夜夜躁人人躁| xvideos亚洲人网站| 日韩美女av在线免费观看| 久久琪琪电影院| 亚洲欧美成人一区二区在线电影| 青青草原一区二区| 亚洲美女在线视频| 欧美日韩免费区域视频在线观看| 91精品久久久久久久久久| 欧美亚洲另类视频| 日韩电影大片中文字幕| 亚洲91av视频| 久久久999精品免费| 亚洲大胆人体视频| 欧美国产亚洲精品久久久8v| 国产精品美女999| 久久精品中文字幕免费mv| 亚洲欧美综合区自拍另类| 热久久这里只有精品| 日韩精品中文字幕在线| 国产视频亚洲精品| 欧洲日本亚洲国产区| 欧美午夜精品在线| 国产美女搞久久| 国产脚交av在线一区二区| 91丨九色丨国产在线| 日韩h在线观看| 国产精欧美一区二区三区| 九九热这里只有精品6| 亚洲视频axxx| 孩xxxx性bbbb欧美| 欧美成人在线网站| 亚洲精品久久久久| 亚洲影院污污.| 亚洲日本aⅴ片在线观看香蕉| 九九九久久国产免费| 中文字幕日韩视频| 国产日韩在线播放| 国产精品一香蕉国产线看观看| 亚洲free性xxxx护士白浆| 国产精品福利无圣光在线一区| 日韩福利视频在线观看| 亚洲乱码国产乱码精品精| 97精品一区二区三区| 久久天天躁狠狠躁夜夜av| 欧美日韩在线观看视频| 欧美精品中文字幕一区| 亚洲成色www8888| 日韩欧美在线一区| 疯狂欧美牲乱大交777| 北条麻妃一区二区三区中文字幕| 综合网中文字幕| 国产精品91久久久久久| 国产精品一二三在线| 国产一区二区三区免费视频| 国产精品视频网| 亚洲毛片在线观看| 欧美日韩色婷婷| 久久久综合免费视频| 国产欧美最新羞羞视频在线观看|