使用中文写文章,当篇幅超过一定程度,必然会使用到诸如:“的”、“你”、“我”这样的常用字。本类思想便是提取中文最常用的一百个字,使用中文世界常用编码(主要有GBK、GB2312、GB18030、UTF-8、UTF-32、Unicode、BigEndianUnicode及UTF-7等)获得其编码字节,以其为搜索词到目标流进行查找,如果查找得到则表示该流使用此种编码。显而易见此类不适用于小篇幅。

  1. using System.Collections.Generic;
  2. using System.IO;
  3. using System.Text;
  4.  
  5. namespace YunShenBuZhiChu.MiMaBenJiaMiFa
  6. {
  7. /// <summary>
  8. /// 文字编码检测。
  9. /// 用于检测一篇文章使用什么编码方式进行编码。
  10. /// </summary>
  11. public class StreamBianMaJianCe
  12. {
  13. /// <summary>
  14. /// BigEndianUnicode编码高频汉字编码
  15. /// </summary>
  16. private List<byte[]> _BigEndianUnicodeGaoPinZiFuBianMaLsit = new List<byte[]>()
  17. {
  18. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  19. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  20. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  21. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  22. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  23. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  24. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  25. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  26. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  27. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  28. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  29. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  30. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,}
  31. };
  32. /// <summary>
  33. /// UTF8编码高频汉字编码
  34. /// </summary>
  35. private List<byte[]> _UTF8GaoPinZiFuBianMaLsit = new List<byte[]>()
  36. {
  37. new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},
  38. new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},
  39. new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},
  40. new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},
  41. new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},
  42. new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},
  43. new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},
  44. new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},
  45. new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},
  46. new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},
  47. new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},
  48. new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},
  49. new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},
  50. new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},
  51. new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},
  52. new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},
  53. new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},new byte[]{,,},
  54. new byte[]{,,},new byte[]{,,},
  55. };
  56. /// <summary>
  57. /// Unicode编码高频汉字编码
  58. /// </summary>
  59. private List<byte[]> _UnicodeGaoPinZiFuBianMaLsit = new List<byte[]>()
  60. {
  61. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  62. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  63. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  64. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  65. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  66. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  67. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  68. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  69. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  70. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  71. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  72. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  73. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,}
  74. };
  75. /// <summary>
  76. /// UTF32编码高频汉字编码
  77. /// </summary>
  78. private List<byte[]> _UTF32GaoPinZiFuBianMaLsit = new List<byte[]>()
  79. {
  80. new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},
  81. new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},
  82. new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},
  83. new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},
  84. new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},
  85. new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},
  86. new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},
  87. new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},
  88. new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},
  89. new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},
  90. new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},
  91. new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},
  92. new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},
  93. new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},
  94. new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,},new byte[]{,,,}
  95. };
  96. /// <summary>
  97. /// UTF7编码高频汉字编码
  98. /// </summary>
  99. private List<byte[]> _UTF7GaoPinZiFuBianMaLsit = new List<byte[]>()
  100. {
  101. new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},
  102. new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},
  103. new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},
  104. new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},
  105. new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},
  106. new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},
  107. new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},
  108. new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},
  109. new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},
  110. new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},
  111. new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},
  112. new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},
  113. new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},
  114. new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},
  115. new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},
  116. new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},
  117. new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},new byte[]{,,,,},
  118. new byte[]{,,,,},new byte[]{,,,,}
  119. };
  120. /// <summary>
  121. /// GB18030编码高频汉字编码
  122. /// </summary>
  123. private List<byte[]> _GB18030GaoPinZiFuBianMaLsit = new List<byte[]>()
  124. {
  125. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  126. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  127. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  128. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  129. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  130. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  131. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  132. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  133. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  134. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  135. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},
  136. new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,},new byte[]{,}
  137. };
  138. /// <summary>
  139. /// 表示需要猜测编码的流。
  140. /// </summary>
  141. private Stream _thisStream;
  142. /// <summary>
  143. /// 构造函数
  144. /// </summary>
  145. /// <param name="_canShuStream">参数流</param>
  146. public StreamBianMaJianCe(Stream _canShuStream)
  147. {
  148. if (_canShuStream == null || _canShuStream.Length < )
  149. {
  150. throw new System.NullReferenceException("WenZiBianMaJianCe构造函数参数_canShuStream不能为空且长度不能小于100");
  151. }
  152. _thisStream = _canShuStream;
  153. }
  154. /// <summary>
  155. /// 检测。
  156. /// </summary>
  157. /// <returns>流的编码</returns>
  158. public Encoding JianCe()
  159. {
  160. byte[] _streamByte = DuQuWeiZiJie();
  161. Encoding _returnEncoding = Encoding.UTF8;
  162. //通过BOM头来判断编码,有BOM头也就没必要去猜了。
  163. if (GenJuBomCaiBianMa(_streamByte, out _returnEncoding) == false)
  164. {
  165. _returnEncoding = CaiJieWenZiBianMa(_streamByte);
  166. }
  167. return _returnEncoding;
  168. }
  169. /// <summary>
  170. /// 读取数据为字节。
  171. /// </summary>
  172. /// <returns></returns>
  173. private byte[] DuQuWeiZiJie()
  174. {
  175. BinaryReader _BinaryReader = new BinaryReader(_thisStream);
  176. byte[] _returnByte = new byte[_thisStream.Length];
  177. //判断流的长度。
  178. if (_thisStream.Length < (long)int.MaxValue)//小于整型值的情况
  179. {
  180. _BinaryReader.Read(_returnByte, , (int)_thisStream.Length);
  181. }
  182. else//大于整型值的情况
  183. {
  184. long _index = ;
  185. while (_index < _returnByte.Length)
  186. {
  187. _returnByte.CopyTo(_BinaryReader.ReadBytes(), _index);
  188. _index = _index + 1024L;
  189. }
  190. }
  191. return _returnByte;
  192. }
  193. /// <summary>
  194. /// 根据BOM头返回编码格式。
  195. /// </summary>
  196. /// <param name="_streamByte">流的字节组。</param>
  197. /// <returns></returns>
  198. private bool GenJuBomCaiBianMa(byte[] _streamByte, out Encoding _ruCanEncoding)
  199. {
  200. //132 49 149 51 GB-18030
  201. if (_streamByte[] == && _streamByte[] == && _streamByte[] == && _streamByte[] == )
  202. {
  203. _ruCanEncoding = Encoding.GetEncoding("GB-18030");
  204. return true;
  205. }
  206.  
  207. //239 187 191 UTF-8
  208. if (_streamByte[] == && _streamByte[] == && _streamByte[] == )
  209. {
  210. _ruCanEncoding = Encoding.UTF8;
  211. return true;
  212. }
  213.  
  214. //254 255 Unicode
  215. if (_streamByte[] == && _streamByte[] == )
  216. {
  217. _ruCanEncoding = Encoding.Unicode;
  218. return true;
  219. }
  220.  
  221. if (_streamByte[] == && _streamByte[] == )
  222. {
  223. //255 254 0 0 UTF-32
  224. if (_streamByte[] == && _streamByte[] == )
  225. {
  226. _ruCanEncoding = Encoding.UTF32;
  227. }
  228.  
  229. //255 254 BigEndianUnicode
  230. _ruCanEncoding = Encoding.BigEndianUnicode;
  231. return true;
  232. }
  233.  
  234. //43 47 118 UTF-7
  235. if (_streamByte[] == && _streamByte[] == && _streamByte[] == )
  236. {
  237. //[ 56 | 57 | 43 | 47 ]
  238. if (_streamByte[] == || _streamByte[] == || _streamByte[] == || _streamByte[] == )
  239. {
  240. _ruCanEncoding = Encoding.UTF7;
  241. return true;
  242. }
  243. }
  244.  
  245. _ruCanEncoding = null;
  246. return false;
  247. }
  248. /// <summary>
  249. /// 猜解文字编码,适用于没有BOM头的情况。
  250. /// </summary>
  251. /// <param name="_streamByte">流的字节组。</param>
  252. /// <returns></returns>
  253. private Encoding CaiJieWenZiBianMa(byte[] _streamByte)
  254. {
  255. //按照中文世界编码使用概率确定猜解顺序。
  256. //UTF8
  257. if (GaoPinZiJianCeUFT8(_streamByte) == true)
  258. {
  259. return Encoding.UTF8;
  260. }
  261. //gb18030
  262. if (GaoPinZiJianCeGB18030(_streamByte) == true)
  263. {
  264. return Encoding.GetEncoding("gb18030");
  265. }
  266. //UTF7
  267. if (GaoPinZiJianCeUTF7(_streamByte) == true)
  268. {
  269. return Encoding.UTF7;
  270. }
  271. //UTF-32任何字符都以四个字节编码,必然可以被四整除
  272. if (_streamByte.Length % == )
  273. {
  274. if (GaoPinZiJianCeUTF32(_streamByte) == true)//UTF32
  275. {
  276. return Encoding.UTF32;
  277. }
  278.  
  279. }
  280. //BigEndianUnicode和Unicode任何字符都以二个字节编码,必然可以被二整除
  281. if (_streamByte.Length % == )
  282. {
  283. //Unicode
  284. if (GaoPinZiJianCeUnicode(_streamByte) == true)
  285. {
  286. return Encoding.Unicode;
  287. }
  288. //BigEndianUnicod
  289. if (GaoPinZiJianCeBigEndianUnicode(_streamByte) == true)
  290. {
  291. return Encoding.BigEndianUnicode;
  292. }
  293. }
  294. //如果上述猜解都失败了,则返回UTF-8。
  295. return Encoding.UTF8;
  296. }
  297. /// <summary>
  298. /// 高频字检查法,UFT8编码方法
  299. /// </summary>
  300. /// <param name="_streamByte">流字节组</param>
  301. /// <returns></returns>
  302. private bool GaoPinZiJianCeUFT8(byte[] _streamByte)
  303. {
  304. //命中次数。
  305. int _mingZhongCiShu = ;
  306.  
  307. foreach (byte[] bShuZu in _UTF8GaoPinZiFuBianMaLsit)
  308. {
  309. for (int i = ; i < _streamByte.Length; i++)
  310. {
  311. //判断首编码是否相等
  312. if (bShuZu[] == _streamByte[i])
  313. {
  314. //如果首字节相等,则检查后面二个字节是否也相等
  315. if ((i + < _streamByte.Length && _streamByte[i + ] == bShuZu[])
  316. && (i + < _streamByte.Length && _streamByte[i + ] == bShuZu[]))
  317. {
  318. _mingZhongCiShu++;
  319. }
  320. }
  321. }
  322.  
  323. //UTF-8有一定几率与其他编码冲突,故而增加命中次数,减少误差。
  324. if (_mingZhongCiShu > )
  325. {
  326. return true;
  327. }
  328. }
  329.  
  330. return false;
  331. }
  332. /// <summary>
  333. /// 高频字检查法,Unicode编码方法
  334. /// </summary>
  335. /// <param name="_streamByte">流字节组</param>
  336. /// <returns></returns>
  337. private bool GaoPinZiJianCeUnicode(byte[] _streamByte)
  338. {
  339. foreach (byte[] bShuZu in _UnicodeGaoPinZiFuBianMaLsit)
  340. {
  341. for (int i = ; i < _streamByte.Length; i++)
  342. {
  343. //判断首编码是否相等
  344. if (bShuZu[] == _streamByte[i]
  345. && (i + < _streamByte.Length && _streamByte[i + ] == bShuZu[]))
  346. {
  347. //如果首字节相等,则检查后面二个字节是否也相等
  348. return true;
  349. }
  350. }
  351. }
  352. return false;
  353. }
  354. /// <summary>
  355. /// 高频字检查法,UTF32编码方法
  356. /// </summary>
  357. /// <param name="_streamByte">流字节组</param>
  358. /// <returns></returns>
  359. private bool GaoPinZiJianCeUTF32(byte[] _streamByte)
  360. {
  361. foreach (byte[] bShuZu in _UTF32GaoPinZiFuBianMaLsit)
  362. {
  363. for (int i = ; i < _streamByte.Length; i++)
  364. {
  365. //判断首编码是否相等
  366. if (bShuZu[] == _streamByte[i])
  367. {
  368. //如果首字节相等,则检查后面二个字节是否也相等
  369. if ((i + < _streamByte.Length && _streamByte[i + ] == bShuZu[])
  370. && (i + < _streamByte.Length && _streamByte[i + ] == bShuZu[])
  371. && (i + < _streamByte.Length && _streamByte[i + ] == bShuZu[]))
  372. {
  373. return true;
  374. }
  375. }
  376. }
  377. }
  378. return false;
  379. }
  380. /// <summary>
  381. /// 高频字检查法,UTF7编码方法
  382. /// </summary>
  383. /// <param name="_streamByte">流字节组</param>
  384. /// <returns></returns>
  385. private bool GaoPinZiJianCeUTF7(byte[] _streamByte)
  386. {
  387. foreach (byte[] bShuZu in _UTF7GaoPinZiFuBianMaLsit)
  388. {
  389. for (int i = ; i < _streamByte.Length; i++)
  390. {
  391. //判断首编码是否相等
  392. if (bShuZu[] == _streamByte[i])
  393. {
  394. //如果首字节相等,则检查后面二个字节是否也相等
  395. if ((i + < _streamByte.Length && _streamByte[i + ] == bShuZu[])
  396. && (i + < _streamByte.Length && _streamByte[i + ] == bShuZu[])
  397. && (i + < _streamByte.Length && _streamByte[i + ] == bShuZu[])
  398. && (i + < _streamByte.Length && _streamByte[i + ] == bShuZu[]))
  399. {
  400. return true;
  401. }
  402. }
  403. }
  404. }
  405. return false;
  406. }
  407. /// <summary>
  408. /// 高频字检查法,GB18030编码方法
  409. /// </summary>
  410. /// <param name="_streamByte">流字节组</param>
  411. /// <returns></returns>
  412. private bool GaoPinZiJianCeGB18030(byte[] _streamByte)
  413. {
  414. foreach (byte[] bShuZu in _GB18030GaoPinZiFuBianMaLsit)
  415. {
  416. for (int i = ; i < _streamByte.Length; i++)
  417. {
  418. //判断首编码是否相等
  419. if (bShuZu[] == _streamByte[i])
  420. {
  421. //如果首字节相等,则检查后面二个字节是否也相等
  422. if ((i + < _streamByte.Length && _streamByte[i + ] == bShuZu[]))
  423. {
  424. return true;
  425. }
  426. }
  427. }
  428. }
  429. return false;
  430. }
  431. /// <summary>
  432. /// 高频字检查法,Unicode编码方法
  433. /// </summary>
  434. /// <param name="_streamByte">流字节组</param>
  435. /// <returns></returns>
  436. private bool GaoPinZiJianCeBigEndianUnicode(byte[] _streamByte)
  437. {
  438. foreach (byte[] bShuZu in _BigEndianUnicodeGaoPinZiFuBianMaLsit)
  439. {
  440. for (int i = ; i < _streamByte.Length; i++)
  441. {
  442.  
  443. //判断首编码是否相等
  444. if (bShuZu[] == _streamByte[i])
  445. {
  446. //如果首字节相等,则检查后面二个字节是否也相等
  447. if ((i + < _streamByte.Length && _streamByte[i + ] == bShuZu[]))
  448. {
  449. return true;
  450. }
  451. }
  452. }
  453. }
  454. return false;
  455. }
  456. }
  457. }
  1. //使用示例
  2. //爬虫判断网页编码
  3. WebRequest _WebRequest = WebRequest.Create(@"https://www.cnblogs.com/j20171203/");
  4. WebResponse _WebResponse = _WebRequest.GetResponse();
  5. Stream _Stream = _WebResponse.GetResponseStream();
  6.  
  7. MemoryStream _MemoryStream = new MemoryStream();
  8. const int bufferLength = ;
  9. byte[] buffer = new byte[bufferLength];
  10. int actual = ;
  11. while (true)
  12. {
  13. actual = _Stream.Read(buffer, , bufferLength);
  14. _MemoryStream.Write(buffer, , actual);
  15.  
  16. if (actual == )
  17. {
  18. break;
  19. }
  20. }
  21. _MemoryStream.Position = ;
  22.  
  23. StreamBianMaJianCe _StreamBianMaJianCe = new StreamBianMaJianCe(_MemoryStream);
  24. Encoding _jieGuoEncoding = _StreamBianMaJianCe.JianCe();
  25.  
  26. _Stream.Close();
  27. _Stream.Dispose();
  28. _WebResponse.Close();

写作时间:2018-07-19

=====================================================================================

本文只代表本人的见解,可能存在错误,仅用于技术交流。如果你喜欢该文,可以扫下面的二维码打赏我(打赏敬请备注“博客园打赏”五字)。

C#判断文件编码——常用字法的更多相关文章

  1. 2018-8-10-C#-判断文件编码

    title author date CreateTime categories C# 判断文件编码 lindexi 2018-08-10 19:16:52 +0800 2018-2-13 17:23: ...

  2. C# 判断文件编码

    我们的项目中会包含有很多文件,但是可能我们没有注意到的,我们的文件的编码不一定是utf-8,所以可能在别人电脑运行时出现乱码.最近在做一个项目,这个项目可以把我们的文件夹里的所有文本,判断他们是什么编 ...

  3. C# 判断文件编码

    无耐网上各种方法都有缺陷,此方法为原创,暂问发现问题.如发现请指正 public static Encoding GetFileEncodingByContent(string path) { var ...

  4. 判断文件的编码 python

    import chardet import string path1= r'C:\Users\25456\Desktop' path = path1 + r'\深度学习.txt' with open( ...

  5. MultipartFile文件编码判断

    MultipartFile文件编码判断 搜索:Java 判断文件的字符集编码 https://blog.csdn.net/top_code/article/details/8891796 但是在Mul ...

  6. 用UltraEdit判断打开文件的编码类型 用UltraEdit或notepad记事本查看文件编码格式 用UltraEdit查看当前文件编码

    用UltraEdit查看当前文件编码 想判断文件的编码类型? 用强大的UltraEdit-32软件: UltraEdit-32的状态栏可以显示文件的编码类型,详细情况如下: ANSI/ANSCI--- ...

  7. 利用js判断文件是否为utf-8编码

    常规方案 使用FileReader以utf-8格式读取文件,根据文件内容是否包含乱码字符�,来判断文件是否为utf-8. 如果存在�,即文件编码非utf-8,反之为utf-8. 代码如下: const ...

  8. C# 判断文件的真实格式

    为了防止图片木马,通过后缀判断文件的格式是不准确的.可以通过这种方式进行判断. static void Main(string[] args) { string path = @"C:\Us ...

  9. [译]如何定义python源文件的文件编码

    简介 这篇文章是为了介绍定义python源文件文件编码的方法.python解释器可以根据所指定的编码信息对当前文件进行解析.通常来说,这种方法可以提高解析器对Unicode编码的源文件的识别,并且支持 ...

随机推荐

  1. web进修之—Hibernate HQL(7)

    概述 HQL是Hibernate封装成为面向对象的数据库查询语言,具有如下特点: 面向对象,包括继承.多态和关联之类的概念,SQL操作的数据库的表,HQL更像是操作对象 大小写敏感,只对对象和属性敏感 ...

  2. MFC控件编程进度条编写

    MFC控件编程进度条编写 一丶进度条编程需要用到的方法 进度条MFC已经帮我们封装好类了. 叫做 CProgressCtrl  进度条编程也很简单. 封装的方法也就那个那几个. GetPos()  获 ...

  3. 彻底弄懂python编码

    在编写python程序的过程中,中英文混用经常会出现编码问题.围绕此问题,本文首先介绍编码的含义及常用编码,随后列举几个python经常遇到的编码异常及解决方法,接着列举笔者在实践中遇到的异常出现的情 ...

  4. SpringBoot学习(二)-->Spring的Java配置方式

    二.Spring的Java配置方式 Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1.@Configuration 和 @Bean Spring的Java配置方式是通过 @ ...

  5. Python字典小结

      字典(dict)结构是Python中常用的数据结构,笔者结合自己的实际使用经验,对字典方面的相关知识做个小结,希望能对读者一些启发~ 创建字典   常见的字典创建方法就是先建立一个空字典,然后逐一 ...

  6. 写一个ORM框架的第一步(Apache Commons DbUtils)

    新一次的内部提升开始了,如果您想写一个框架从Apache Commons DbUtils开始学习是一种不错的选择,我们先学习应用这个小“框架”再把源代码理解,然后写一个属于自己的ORM框架不是梦. 一 ...

  7. T-SQL基础(二)之关联查询

    在上篇博文中介绍了T-SQL查询的基础知识,本篇主要介绍稍微复杂的查询形式. 表运算符 表运算符的作用是把为其提供的表作为输入,经过逻辑查询处理,返回一个表结果.SQL Server支持四个表运算符: ...

  8. git 创建本地分支与远程分支

    早上抽空整理了下git常用操作,偶尔看看加深下印象吧: 如果github上已经有master分支 和dev分支 在本地 git checkout -b dev 新建并切换到本地dev分支 git pu ...

  9. sqoop将mysql数据导入hbase、hive的常见异常处理

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10700700.html,否则将追究法律责任!!! 一.需求: 1.将以下这张表(test_ ...

  10. 让MySQL查询更加高效——对查询进行重构

    在优化有问题的查询时,目标应该是找到一个更优的方法获得实际需要的结果,而不是一定总是要求从MySQL获取一模一样的结果集 一个复杂查询还是多个简单查询 设计查询的时候一定需要考虑的问题就是,是否需要将 ...