C#實現(xiàn)獲取文本文件的編碼的一個類(區(qū)分GB2312和UTF8)
更新時間:2014年09月15日 10:49:59 投稿:junjie
這篇文章主要介紹了C#實現(xiàn)獲取文本文件的編碼一個類,本文給出類可以自動區(qū)分GB2312和UTF8,并同時給出了使用方法,需要的朋友可以參考下
以下是獲取文件編碼的一個類:
using System;
using System.IO;
using System.Text;
/// <summary>
/// FileEncoding 的摘要說明
/// </summary>
namespace FileEncoding
{
/// <summary>
/// 獲取文件的編碼格式
/// </summary>
public class EncodingType
{
/// <summary>
/// 給定文件的路徑,讀取文件的二進(jìn)制數(shù)據(jù),判斷文件的編碼類型
/// </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; //計算當(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個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("非預(yù)期的byte格式");
}
return true;
}
}
}
以下是使用示例:
#region 打開按鈕
/// <summary>
/// 打開按鈕
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txtMenuOpen_Click(object sender, EventArgs e)
{
string fName;
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.InitialDirectory = "";//注意這里寫路徑時要用c:而不是c:
openFileDialog.Filter = "文本文檔|*.txt";
openFileDialog.RestoreDirectory = true;
openFileDialog.FilterIndex = 1;
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
fName = openFileDialog.FileName;
txtBox.Text = System.IO.File.ReadAllText(fName,
FileEncoding.EncodingType.GetType(fName));
}
}
#endregion
相關(guān)文章
c#調(diào)用arcgis地圖rest服務(wù)示例詳解(arcgis地圖輸出)
ArcGIS REST API提供了簡單、開放的接口來訪問和使用ArcGIS Server發(fā)布的服務(wù)。使用ArcGIS REST API通過URL可以獲取和操作每一個服務(wù)中的所有資源和操作2013-12-12
c# 動態(tài)加載dll文件,并實現(xiàn)調(diào)用其中的簡單方法
下面小編就為大家?guī)硪黄猚# 動態(tài)加載dll文件,并實現(xiàn)調(diào)用其中的簡單方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01
使用aspose.word 第三方的插件實現(xiàn)導(dǎo)出word
本文給大家分享的是一個使用使用aspose.word 第三方的插件實現(xiàn)導(dǎo)出word的實例,十分的實用,有需要的小伙伴可以參考下。2015-06-06
C#多線程學(xué)習(xí)之(四)使用線程池進(jìn)行多線程的自動管理
這篇文章主要介紹了C#多線程學(xué)習(xí)之使用線程池進(jìn)行多線程的自動管理,實例分析了C#中線程池的概念與相關(guān)的使用技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04
C#實現(xiàn)Base64處理的加密解密,編碼解碼示例
這篇文章主要介紹了C#實現(xiàn)Base64處理的加密解密,編碼解碼,結(jié)合實例形式分析了基于C#實現(xiàn)的base64編碼解碼操作相關(guān)技巧,需要的朋友可以參考下2017-01-01

