C#怎么辨别文本文档的编码

C#怎么辨别文本文档的编码,第1张

这个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#获取任何文件的编码格式等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9533702.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存