Text文档编码识别方法

  在做文档读取的时候,时常碰到编码格式不正确的问题,而要怎么样正确识别文档的编码格式,成了很多程序员的一块心病,今天我就要试着治好这块心病,这段代码的浓缩来自上千万文档的数据分析所得,可靠率极其高。

  应朋友要求,需要帮他做一个文章操作工具,既然想操作,就有文件的读取和修改,本来花费几个小时信心满满把程序交给朋友的时候,朋友突然来了句,很多文章打开出现乱码的情况,我哩个去,像是晴天霹雳深深的击在我的心窝里,我突然想到了文件编码问题,而这个问题,我曾经无数次的尝试,最终都以失败而告终,每次尝试,只不过是减少了错误概率的出现,但是还不足以弥补文件编码格式分析完全的正确,而这次,朋友又提出来编码问题,我瞬间凌乱了。

  如果不把这个问题解决,给朋友做的工具等于没有任何作用,我TM前两天还吃人家一顿大餐,难道还能吐出来吗?这个搞不定,面子就丢大了,无奈之下,我询问了朋友那里有多少文件?得到答复:好几千万。瞬间我眼光放亮了,那就海量数据分析吧。

  海量数据分析的时候,我使用的是一个笨方法,就是把所有文件头数据读取出来,比如读取4个byte,然后将读取的文件内容的前一百个字以(Unicode,UnicodeBigEndian,UTF8,ANSI等等)读取出来,肉眼识别吧,比如

  public class Info{

    public int ch0;//第一个字符

    public int ch1;//第二个字符

    public int ch2;//第三个字符

    public int ch3;//第四个字符

    public string UnicodeStr;//前100个字

    public string UnicodeBigEndianStr;//前100个字

    public string UTF8Str;//前100个字

    public string ANSIStr;//前100个字

  }

然后使用lambda做排序,个人建议对UnicodeStr,UnicodeBigEndianStr,UTF8Str,ANSIStr这些做排序,因为可识别的字符编码有一定的区间范围,做排序后,可识别汉字的一定都堆在一起;

再有就是可以对 ch0,ch1,ch2,ch3,做详细分类,看看它们之间都有什么样的关系,通过观察,我也是能发现什么的;通过归纳和总结,就得出了TEXT编码的可识别方法,如下: 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO; namespace 文章操作工具
{
public class TextHelper
{
public static System.Text.Encoding GetType(string filename)
{
FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
System.Text.Encoding r = GetType(fs);
fs.Close();
return r;
} public static System.Text.Encoding GetType(FileStream fs)
{
/*
Unicode
------------------
255 254 ======================
UnicodeBigEndian
-------------------
254 255 ======================
UTF8
-------------------
34 228
34 229
34 230
34 231
34 232
34 233
239 187 ======================
ANSI
-------------------
34 176
34 177
34 179
34 180
34 182
34 185
34 191
34 194
34 196
34 198
34 201
34 202
34 205
34 206
34 208
34 209
34 210
34 211
34 213
196 167
202 213
206 228
*/
BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default);
byte[] ss = r.ReadBytes();
int lef = ss[];
int mid = ss[];
int rig = ss[];
r.Close();
/* 文件头两个字节是255 254,为Unicode编码;
文件头三个字节 254 255 0,为UTF-16BE编码;
文件头三个字节 239 187 191,为UTF-8编码;*/
if (lef == && mid == )
{
return Encoding.Unicode;
}
else if (lef == && mid == && rig == )
{
return Encoding.BigEndianUnicode;
}
else if (lef == && mid == )
{
return Encoding.BigEndianUnicode;
}
else if (lef == && mid == && rig == )
{
return Encoding.UTF8;
}
else if (lef == && mid == )
{
return Encoding.UTF8;
}
else if (lef == && mid ==
|| lef == && mid ==
|| lef == && mid == )
{
return Encoding.Default;
}
else
{
if (lef == )
{
if (mid < ) return Encoding.Default;
else return Encoding.UTF8;
}
else
{
if (lef < ) return Encoding.Default;
else return Encoding.UTF8;
}
}
}
}
}

Text文档编码识别方法的更多相关文章

  1. 如何用pdfbox-app-1.8.10.jar批处理将pdf文档转换成text文档

    1.首先下载pdfbox-app-1.8.10.jar(下载地址:http://pdfbox.apache.org/download.html) 2.将pdfbox-app-1.8.10.jar加载到 ...

  2. 自动文档摘要评价方法:Edmundson,ROUGE

    自动文档摘要评价方法大致分为两类: (1)内部评价方法(Intrinsic Methods):提供参考摘要,以参考摘要为基准评价系统摘要的质量.系统摘要与参考摘要越吻合, 质量越高. (2)外部评价方 ...

  3. [No0000190]vim8安装教程和vim中文帮助文档Vimcdoc安装方法-Vim使用技巧(5)

    Vim8.0是近十年来的一次大更新,支持任务.异步I/O.Channels和JSON以及异步计时器.Lambdas 和 Closures等,还包括对GTK + 3的支持.由于ubuntu默认安装的Vi ...

  4. 上传Text文档并转换为PDF(解决乱码)

    前些日子,Insus.NET有分享一篇<上传Text文档并转换为PDF>http://www.cnblogs.com/insus/p/4313092.html 它是按最简单与默认方式来处理 ...

  5. JavaScipt选取文档元素的方法

    摘自JavaScript权威指南(jQuery根据样式选择器查找元素的终极方式是 先用getElementsByTagName(*)获取所有DOM元素,然后根据样式选择器对所有DOM元素进行筛选) 选 ...

  6. Effective Java 第三版——74. 文档化每个方法抛出的所有异常

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  7. Java读取“桌面”、“我的文档”路径的方法

    读取“桌面”的方法: javax.swing.filechooser.FileSystemView fsv = javax.swing.filechooser.FileSystemView.getFi ...

  8. JDOM生成XML文档的一般方法

    由于DOM提供的生成XML的方法不够直观,而且要用到各种繁琐的注解,鉴于此可借助第三方库-----JDOM生成XML文档.具体操作方式如下: import java.io.FileOutputStre ...

  9. IIS下不能下载文件的docx文档,XLSX文档的设置方法(转)

    IIS下不能下载文件的docx文档,XLSX文档的设置方法 Office 2007的的界面风格默认格式中都是.DOCX,XLSX,PPTX等等后缀,连结中包含此类文件时,界面风格默认什么打不开的其实只 ...

随机推荐

  1. AJAX 同步异步笔记

    就在刚才,做一个很简单的Demo, 预览MP4视频文件 这就是一个video标签嘛,然后再动态的给src赋值嘛.这还不是so easy? 好,说做就做.先简单的测试一下.先给src赋值一下. 嗯,可以 ...

  2. NHibernate开发入门

    首先,我们了解一下ORM是什么?ORM指对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程 ...

  3. IOS UIAppLocation 单例模式

    UIApplocation * app=[UIApplocation shareapplocation]; UIAppLocation 只能被初始化一次. 一个程序中只能被创建一次,称为单例模式. 单 ...

  4. IE6图片元素img下高度超出出现多余空白

    将图片转换为块级元素:display:block; 设置图片的垂直对齐方式:vertical-align属性为top,text-top,bottom,text-bottom 设置父元素的字体大小为0p ...

  5. select2插件不兼容ie7,ie7下样子显示错位问题

    1.源文件(未修改) select2.min.css.select2.min.js 2.ie7下显示样式: 3.ie8下显示样式: 4.经查看发现ie7下对一些属性的解析和ie8不同,需对ie7另作h ...

  6. Python 端口,IP扫描

    Python Socket函数 (1)TCP发送数据时,已建立好连接,不需要指定地址.UDP是面向无连接,每次分别指定发给谁. (2)s.bind(address) 将套接字绑定到地址,在AF_INE ...

  7. oracle 和c3p0 数据库的Time_Wait 过多问题的一个解决方案。

    项目是B/S模式,放在linux服务器上,tomcat和oracle11g在一台服务器上,tomcat读取数据库采用C3P0连接池,一直比较稳定,所以也没有去管.后来把tomcat放在一台win200 ...

  8. yoman 创建generator

    yoman作为一个模板工具,能够创建自己的模板,下面具体介绍下. 首先 安装一个模板工具(npm install -g generator-generator),此工具会自动创建一些必要的文件.安装完 ...

  9. 简单谈谈如何利用h5实现音频的播放

    作者:白狼 出处:http://www.manks.top/article/h5_audio本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律 ...

  10. Bubble Sort (5775)

    Bubble Sort Problem Description   P is a permutation of the integers from 1 to N(index starting from ...