C#⾃动获取指定⽂本⽂件的编码格式Encoding以及
BOM(ByteOrderMark字。。。
我们在读写⽂本⽂件(如.txt,.csv,.log等)过程中,如果指定的⽂本⽂件编码格式不正常,读写就会出现乱码现象。
这⾥⾃动获取编码格式
BOM【字节顺序标记】
BOM(Byte Order Mark),字节顺序标记,出现在⽂本⽂件头部,Unicode编码标准中⽤于标识⽂件是采⽤哪种格式的编码。不同编码的字节顺序标记的表⽰
编码表⽰ ()表⽰ ()
EF BB BF239 187 191
(⼤端序)FE FF254 255
(⼩端序)FF FE255 254
(⼤端序)00 00 FE FF0 0 254 255
(⼩端序)FF FE 00 00255 254 0 0
2B 2F 76和以下的⼀个字节:[ 38 | 39 | 2B | 2F ]43 47 118和以下的⼀个字节:[ 56 | 57 | 43 | 47 ]
en:UTF-1F7 64 4C247 100 76
en:UTF-EBCDIC DD 73 66 73221 115 102 115
en:Standard Compression Scheme for
Unicode
0E FE FF14 254 255
en:BOCU-1FB EE 28及可能跟随着FF251 238 40及可能跟随着255
GB-1803084 31 95 33132 49 149 51
C#⽰例代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AutoGetFileEncoderDemo
{
class Program
{
static void Main(string[] args)
{
string fileName = @"C:\Users\Administrator\";
Encoding encoding = GetTextFileEncodingType(fileName);
Console.WriteLine(encoding.GetType());
Console.WriteLine($"代码页:【{encoding.CodePage}】,描述【{encoding.EncodingName}】");
Console.WriteLine($"WindowsCodePage:【{encoding.WindowsCodePage}】,WebName:【{encoding.WebName}】,HeaderName:【{encoding.HeaderNam            Console.ReadLine();
}
/// <summary>
/// 获取⽂本⽂件的字符编码类型
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
static Encoding GetTextFileEncodingType(string fileName)
{
Encoding encoding = Encoding.Default;
FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
BinaryReader binaryReader = new BinaryReader(fileStream, encoding);
byte[] buffer = binaryReader.ReadBytes((int)fileStream.Length);
binaryReader.Close();
fileStream.Close();
if (buffer.Length >= 3 && buffer[0] == 239 && buffer[1] == 187 && buffer[2] == 191)
{
encoding = Encoding.UTF8;
}
else if (buffer.Length >= 3 && buffer[0] == 254 && buffer[1] == 255 && buffer[2] == 0)
{
encoding = Encoding.BigEndianUnicode;
}
else if (buffer.Length >= 3 && buffer[0] == 255 && buffer[1] == 254 && buffer[2] == 65)
{
encoding = Encoding.Unicode;
}
else if (IsUTF8Bytes(buffer))
{
encoding = Encoding.UTF8;
}
return encoding;
unicode文件格式
}
/// <summary>
/// 判断是否是不带 BOM 的 UTF8 格式
/// BOM(Byte Order Mark),字节顺序标记,出现在⽂本⽂件头部,Unicode编码标准中⽤于标识⽂件是采⽤哪种格式的编码。        /// </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开始如:1111110X
if (charByteCounter == 1 || charByteCounter > 6)
{
return false;
}
}
}
else
{
//若是UTF-8 此时第⼀位必须为1
if ((curByte & 0xC0) != 0x80)
if ((curByte & 0xC0) != 0x80)
{
return false;
}
charByteCounter--;
}
}
if (charByteCounter > 1)
{
throw new Exception("⾮预期的byte格式");            }
return true;
}
}
}
测试运⾏如图:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。