
这个C#里面没有现成的方法可以使用,得自己写。。\x0d\以下是一个完整的判断文件编码的类,类名EncodingType,命名空间FileEncoding。。\x0d\将其保存为一个类文件之后就可以使用了。。\x0d\\x0d\using System;\x0d\using SystemCollectionsGeneric;\x0d\using SystemLinq;\x0d\using SystemText;\x0d\using SystemIO;\x0d\\x0d\namespace FileEncoding\x0d\{\x0d\ /// \x0d\ /// 获取文件的编码格式\x0d\ /// \x0d\ public class EncodingType\x0d\ {\x0d\ /// \x0d\ /// 给定文件的路径,读取文件的二进制数据,判断文件的编码类型\x0d\ /// \x0d\ /// 文件路径\x0d\ /// 文件的编码类型\x0d\ public static SystemTextEncoding GetType(string FILE_NAME)\x0d\ {\x0d\ FileStream fs = new FileStream(FILE_NAME, FileModeOpen, FileAccessRead);\x0d\ Encoding r = GetType(fs);\x0d\ fsClose();\x0d\ return r;\x0d\ }\x0d\\x0d\ /// \x0d\ /// 通过给定的文件流,判断文件的编码类型\x0d\ /// \x0d\ /// 文件流\x0d\ /// 文件的编码类型\x0d\ public static SystemTextEncoding GetType(FileStream fs)\x0d\ {\x0d\ byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 };\x0d\ byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 };\x0d\ byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM\x0d\ Encoding reVal = EncodingDefault;\x0d\\x0d\ BinaryReader r = new BinaryReader(fs, SystemTextEncodingDefault);\x0d\ int i;\x0d\ intTryParse(fsLengthToString(), out i);\x0d\ byte[] ss = rReadBytes(i);\x0d\ if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF))\x0d\ {\x0d\ reVal = EncodingUTF8;\x0d\ }\x0d\ else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00)\x0d\ {\x0d\ reVal = EncodingBigEndianUnicode;\x0d\ }\x0d\ else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41)\x0d\ {\x0d\ reVal = EncodingUnicode;\x0d\ }\x0d\ rClose();\x0d\ return reVal;\x0d\ }\x0d\ /// \x0d\ /// 判断是否是不带 BOM 的 UTF8 格式\x0d\ /// \x0d\ /// \x0d\ /// \x0d\ private static bool IsUTF8Bytes(byte[] data)\x0d\ {\x0d\ int charByteCounter = 1; //计算当前正分析的字符应还有的字节数\x0d\ byte curByte; //当前分析的字节\x0d\ for (int i = 0; i = 0x80)\x0d\ {\x0d\ //判断当前\x0d\ while (((curByte 6)\x0d\ {\x0d\ return false;\x0d\ }\x0d\ }\x0d\ }\x0d\ else\x0d\ {\x0d\ //若是UTF-8 此时第一位必须为1\x0d\ if ((curByte & 0xC0) != 0x80)\x0d\ {\x0d\ return false;\x0d\ }\x0d\ charByteCounter--;\x0d\ }\x0d\ }\x0d\ if (charByteCounter > 1)\x0d\ {\x0d\ throw new Exception("非预期的byte格式");\x0d\ }\x0d\ return true;\x0d\ }\x0d\ }\x0d\}\x0d\\x0d\使用的时候先引用命名空间。。\x0d\using FileEncoding;\x0d\然后这样。。
前几天刚做了一个 对文本文件分析编码方式以便正确转码
CodepageDetectorProxy detector = CodepageDetectorProxygetInstance();
detectoradd(UnicodeDetectorgetInstance());
detectoradd(JChardetFacadegetInstance());
detectoradd(ASCIIDetectorgetInstance());
File f = new File(url);
Charset charset = detectordetectCodepage(ftoURI()toURL());
//判断是否是UTF-8编码的文件
if("UTF-8"equals(charsettoString())){
br = new BufferedReader(new InputStreamReader(new FileInputStream(url),"UTF-8"));
} else {
br = new BufferedReader(new InputStreamReader(new FileInputStream(url),"GBK"));
}
可以判断的编码有不少 楼主可以输出试试看
cpdetector_1010和 chardet (jchardet-11)这个是依赖jar包
你试试看这两种方式:
1、
FileStream fs = new FileStream("你的路径", FileAccessReadWrite, FileModeOpenOrCreate);
StreamReader sr = new StreamReader(fs, EncodingDefault);
srReadToEnd();
srClose();
fsClose();
2、
FileReadAllLines("你的路径", EncodingDefault);
很多种呀,具体可以分析一下 File类,
EncodingDefault一般来讲不会乱码了,如果会你其他的编码
其实没有哪个可以100%确定编码的,包括JAVA的类也一样。
TEXT的存储不标识编码,那么,如何确定呢,其实一个GBK或者UNICODE的文本文件,就认为它是ANSI也是有道理的:里面放着不可打印字符 这个也行啊。
所谓的识别,其实就是识别可打印字符。
ANSI 是1BYTE存储,每个里面可打印字符都在128以内,如果你读取文本的前四个BYTE都是可打印字符,那么就是ANSI了。
同样,GBK是3位存储的,同样有着可打印特征,UNICODE是4位,也有着不同于GBK的特征码,注意这些其实就是可打印字符范围,3BYTE可以存储160w种符号,其中可打印符号的编码是有规则的,UNICODE同理。
也就是说,你读取文本的前4位(读取12位判定会更好),根据不同特征(每个BYTE的范围)就可以基本判定了。
具体的特征范围有完整的规范,可以在网上查到。
以上就是关于C#怎么辨别文本文档的编码全部的内容,包括:C#怎么辨别文本文档的编码、如何获取CSV文件的编码方式、怎么用C#获取任何文件的编码格式等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)