[C#.net]獲取文本文件的編碼,自動區分GB2312和UTF8


昨天生產突然反饋上傳的結果查詢出現了亂碼,我趕緊打開后台數據庫,發現果真有數據變成了亂碼。這個上傳程序都運行3個多月了,從未發生亂碼現象,查看程序的運行日志,發現日志里的中文都變成了亂碼,然后對比之前和現在的上傳文件,發現了問題,之前文件格式是ANSI,現在變成了UTF8

 

然后直接上網搜索解決方法,方法如下:

using System; 
using System.IO; 
using System.Text; 

/// <summary> 
/// FileEncoding 的摘要說明 
/// </summary> 
namespace FileEncoding 
{ 
/// <summary> 
/// 獲取文件的編碼格式 
/// </summary> 
public class EncodingType 
{ 
/// <summary> 
/// 給定文件的路徑,讀取文件的二進制數據,判斷文件的編碼類型 
/// </summary> 
/// <param name=“FILE_NAME“>文件路徑</param> 
/// <returns>文件的編碼類型</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> 
/// 通過給定的文件流,判斷文件的編碼類型 
/// </summary> 
/// <param name=“fs“>文件流</param> 
/// <returns>文件的編碼類型</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; //計算當前正分析的字符應還有的字節數 
byte curByte; //當前分析的字節. 
for (int i = 0; i < data.Length; i++) 
{ 
curByte = data[i]; 
if (charByteCounter == 1) 
{ 
if (curByte >= 0x80) 
{ 
//判斷當前 
while (((curByte <<= 1) & 0x80) != 0) 
{ 
charByteCounter++; 
} 
//標記位首位若為非0 則至少以2個1開始 如:110XXXXX...........1111110X 
if (charByteCounter == 1 || charByteCounter > 6) 
{ 
return false; 
} 
} 
} 
else 
{ 
//若是UTF-8 此時第一位必須為1 
if ((curByte & 0xC0) != 0x80) 
{ 
return false; 
} 
charByteCounter--; 
} 
} 
if (charByteCounter > 1) 
{ 
throw new Exception("非預期的byte格式"); 
} 
return true; 
} 

} 


}

調用方法

 using (StreamReader sr = new StreamReader(file.FullName, EncodingType.GetType(file.FullName)))
                                {
                                    string sTemp = string.Empty;
                                    string sCurEncode = sr.CurrentEncoding.EncodingName;

順利解決問題

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM