C#實(shí)現(xiàn)讀取txt通用的方法小結(jié)
該類(lèi)主要支持判斷三種編碼類(lèi)型:UTF-8、Unicode(Little Endian)、BigEndianUnicode。在執(zhí)行判斷時(shí),會(huì)檢查文件的字節(jié)序標(biāo)記(BOM)以及一些特征字節(jié),從而確定文件的編碼類(lèi)型。這樣的判斷對(duì)于讀取文件時(shí)確保正確解析文本內(nèi)容。
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; namespace ImageRect { public class EncodingType { /// <summary> /// 給定文件的路徑,讀取文件的二進(jìn)制數(shù)據(jù),判斷文件的編碼類(lèi)型 /// </summary> /// <param name=“FILE_NAME“>文件路徑</param> /// <returns>文件的編碼類(lèi)型</returns> public static System.Text.Encoding GetType(string FILE_NAME) { FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read); Encoding r = GetType(fs); fs.Close(); return r; } /// <summary> /// 通過(guò)給定的文件流,判斷文件的編碼類(lèi)型 /// </summary> /// <param name=“fs“>文件流</param> /// <returns>文件的編碼類(lèi)型</returns> public static System.Text.Encoding GetType(FileStream fs) { byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 }; byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 }; byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //帶BOM Encoding reVal = Encoding.Default; BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default); int i; int.TryParse(fs.Length.ToString(), out i); byte[] ss = r.ReadBytes(i); if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF)) { reVal = Encoding.UTF8; } else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00) { reVal = Encoding.BigEndianUnicode; } else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41) { reVal = Encoding.Unicode; } r.Close(); return reVal; } /// <summary> /// 判斷是否是不帶 BOM 的 UTF8 格式 /// </summary> /// <param name=“data“></param> /// <returns></returns> private static bool IsUTF8Bytes(byte[] data) { int charByteCounter = 1; //計(jì)算當(dāng)前正分析的字符應(yīng)還有的字節(jié)數(shù) byte curByte; //當(dāng)前分析的字節(jié). for (int i = 0; i < data.Length; i++) { curByte = data[i]; if (charByteCounter == 1) { if (curByte >= 0x80) { //判斷當(dāng)前 while (((curByte <<= 1) & 0x80) != 0) { charByteCounter++; } //標(biāo)記位首位若為非0 則至少以2個(gè)1開(kāi)始 如:110XXXXX...........1111110X if (charByteCounter == 1 || charByteCounter > 6) { return false; } } } else { //若是UTF-8 此時(shí)第一位必須為1 if ((curByte & 0xC0) != 0x80) { return false; } charByteCounter--; } } if (charByteCounter > 1) { throw new Exception("非預(yù)期的byte格式"); } return true; } } }
到此這篇關(guān)于C#實(shí)現(xiàn)讀取txt通用的方法小結(jié)的文章就介紹到這了,更多相關(guān)C#讀取txt內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解C#如何實(shí)現(xiàn)隱式類(lèi)型轉(zhuǎn)換
Result?類(lèi)型是許多編程語(yǔ)言中處理錯(cuò)誤的常用方式,包括?C#?的?dotNext?庫(kù)。在本文中,我們將通過(guò)例子回顧?C#?中?using?語(yǔ)句和隱式類(lèi)型轉(zhuǎn)換的使用,感興趣的可以了解一下2023-01-01新手小白用C# winform 讀取Excel表的實(shí)現(xiàn)
這篇文章主要介紹了新手小白用C# winform 讀取Excel表的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01C#使用oledb讀取excel表格內(nèi)容到datatable的方法
這篇文章主要介紹了C#使用oledb讀取excel表格內(nèi)容到datatable的方法,涉及C#操作oledb及datatable的相關(guān)技巧,需要的朋友可以參考下2015-05-05C#實(shí)現(xiàn)Winform中打開(kāi)網(wǎng)頁(yè)頁(yè)面的方法
這篇文章主要介紹了C#實(shí)現(xiàn)Winform中打開(kāi)網(wǎng)頁(yè)頁(yè)面的方法,涉及WinForm中WebBrowser的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08WPF?Trigger改變屬性無(wú)效問(wèn)題排查示例詳解
這篇文章主要為大家介紹了WPF?Trigger改變屬性無(wú)效問(wèn)題排查示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10C#創(chuàng)建一個(gè)可快速重復(fù)使用的項(xiàng)目模板(詳細(xì)過(guò)程)
這篇文章主要介紹了C#如何創(chuàng)建一個(gè)可快速重復(fù)使用的項(xiàng)目模板今天給大家介紹的是基于官方的cli donet new 命令創(chuàng)建自己的項(xiàng)目模板,需要的朋友可以參考下2024-06-06C#使用PPT組件的CreateVideo方法實(shí)現(xiàn)視頻生成
這篇文章主要為大家詳細(xì)介紹了C#如何使用PPT組件的CreateVideo方法實(shí)現(xiàn)視頻生成,文中的示例代碼講解詳細(xì),有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10C# MVC 使用LayUI實(shí)現(xiàn)下拉框二級(jí)聯(lián)動(dòng)的功能
這篇文章主要介紹了C# MVC 如何使用LayUI實(shí)現(xiàn)下拉框二級(jí)聯(lián)動(dòng),文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06Unity實(shí)現(xiàn)10天簽到系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)10天簽到系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04