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(3);
            int lef = ss[0];
            int mid = ss[1];
            int rig = ss[2];
            r.Close();
            /*  文件头两个字节是255 254,为Unicode编码;
                文件头三个字节  254 255 0,为UTF-16BE编码;
                文件头三个字节  239 187 191,为UTF-8编码;*/
            if (lef == 255 && mid == 254)
            {
                return Encoding.Unicode;
            }
            else if (lef == 254 && mid == 255 && rig == 0)
            {
                return Encoding.BigEndianUnicode;
            }
            else if (lef == 254 && mid == 255)
            {
                return Encoding.BigEndianUnicode;
            }
            else if (lef == 239 && mid == 187 && rig == 191)
            {
                return Encoding.UTF8;
            }
            else if (lef == 239 && mid == 187)
            {
                return Encoding.UTF8;
            }
            else if (lef == 196 && mid == 167
                || lef == 206 && mid == 228
                || lef == 202 && mid == 213)
            {
                return Encoding.Default;
            }
            else
            {
                if (lef == 34)
                {
                    if (mid < 220) return Encoding.Default;
                    else return Encoding.UTF8;
                }
                else
                {
                    if (lef < 220) return Encoding.Default;
                    else return Encoding.UTF8;
                }
            }
        }
    }
}
时间: 2024-11-04 21:10:13

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

VIM显示utf-8文档乱码解决方法

1.相关基础知识介绍 在Vim中,有四个与编码有关的选项,它们是:fileencodings.fileencoding.encoding和termencoding.在实际使用中,任何一个选项出现错误,都会导致出现乱码.因此,每一个Vim用户都应该明确这四个选项的含义.下面,我们详细介绍一下这四个选项的含义和作用. (1)encoding encoding是Vim内部使用的字符编码方式.当我们设置了encoding之后,Vim内部所有的buffer.寄存器.脚本中的字符串等,全都使用这个编码.Vi

选取文档元素的方法总结

在讲解如何选取文档元素之前,先普及一下什么是文档节点: HTML文档的每个节点都表示一个Node对象,节点树形结构的根部是Document节点,代表整个文档,代表HTML元素的节点是Element节点,代表文本的节点是Text节点:Document.Element.Text类都是Node类的子类:(Comment节点类型代表注释节点,Attr节点类型代表属性) 查询一个或多个文档元素的方法: (文档Document对象和元素Element对象均定义了以下方法,即也可以在一个元素Element上选

如何用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加载到eclipse工程中 1.新建java工程:Flie->New->Java Project,如PdfToText工程,然后右键该工程BuildPath->Configure Bulid Path..,单击Libaries,点击Add External JARs,将刚才下载好的pdfbox-a

自动文档摘要评价方法

自动文档摘要评价方法大致分为两类: (1)内部评价方法(Intrinsic Methods):提供参考摘要,以参考摘要为基准评价系统摘要的质量.系统摘要与参考摘要越吻合, 质量越高. (2)外部评价方法(Extrinsic Methods):不提供参考摘要,利用文档摘要代替原文档执行某个文档相关的应用.例如:文档检索.文档聚类.文档分类等, 能够提高应用性能的摘要被认为是质量好的摘要. 一.Edmundson: Edmundson评价方法比较简单,可以客观评估,就是通过比较机械文摘(自动文摘系统

四.OC基础--1.文档安装和方法重载,2.self和super&amp;static,3.继承和派生,4.实例变量修饰符 ,5.私有变量&amp;私有方法,6.description方法

四.OC基础--1.文档安装和方法重载, 1. 在线安装 xcode-> 系统偏好设置->DownLoads->Doucument->下载 2. 离线安装 百度xcode文档 3. 方法重载: 是指在一个类中定义多个同名的方法 在OC中没有重载 2.self和super&static, self和super: 1. self理解: 谁调用当前方法, self就代表谁. 比如: 在对象方法中,self代表的是对象, 因为只有对象才可以调用对象方法 在类方法中, self代表的

文档拍照识别技术

文档拍照识别技术 文档拍照识别技术需求背景: 在很场景中都涉及到对纸质文档汉字的录入,传统的手机录入速度非常慢,体验差.针对这些需求,我们推出了文档拍照识别技术,使用手机或者平板电脑对纸质文档进行拍照后,可以自动识别文字.目前支持android和ios主流操作平台,提供SDK开发包,支持二次开发.可集成到各种APP中,集成后即可获得拍照识别图片文字的功能. 相对于传统的手工录入方式来说,OCR(Optical Character Recognition,光学字符识别)智能录入具有强大的优势,OC

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

IIS下不能下载文件的docx文档,XLSX文档的设置方法 Office 2007的的界面风格默认格式中都是.DOCX,XLSX,PPTX等等后缀,连结中包含此类文件时,界面风格默认什么打不开的其实只要在IIS中的MIME的类型中添加对此格式的支持就可以了下面提供两种方法扩展功能,推荐使用第二种. 方法一:打开网站属性,的HTTP头选项对话牌,添加的MIME类型 新建一种类型,填入需要的 .docx ,类型为 application/vnd.openxmlformats-officedocume

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

前些日子,Insus.NET有分享一篇<上传Text文档并转换为PDF>http://www.cnblogs.com/insus/p/4313092.html 它是按最简单与默认方式来处理. 它在处理带有中文的文本文件时,转换为PDF时,中文不能正常显示,乱码. 本篇算得上是在那基础上,进行重构,解决乱码问题. 为了解决字符问题,我们需要在专案下创建一个目录,如Fonts是用来存储字体.我们去windows目录下把SIMSUN.TTC字体拷贝过来. 在控制器的PostFile()操作中,也得需

JavaScipt选取文档元素的方法

摘自JavaScript权威指南(jQuery根据样式选择器查找元素的终极方式是 先用getElementsByTagName(*)获取所有DOM元素,然后根据样式选择器对所有DOM元素进行筛选) 选取文档元素的方法: 1.通过ID选取元素(getElementById)   1)使用方法:document.getElementById("domId")        其中,domId为要选取元素的id属性值   2)兼容性:低于IE8版本的IE浏览器对getElementById方法