zoukankan      html  css  js  c++  java
  • Text文档编码识别方法

    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;
                    }
                }
            }
        }
    }
  • 相关阅读:
    k8s记录-helm部署(九)
    k8s记录-master组件部署(八)
    Hadoop记录-Apache hadoop+spark集群部署
    k8s记录-ubuntu安装docker
    Nginx记录-Proxy_pass多个应用配置(转载)
    Java动态调用脚本语言Groovy
    05 吸收应用-会整理还不够?教你吸收、联想、输出、应用
    02 超级搜索术——资源搜索:全面、快速查找全网你想要的任何信息、情报
    01 超级搜索术——信息搜索:全面、快速查找全网你想要的任何信息、情报
    长赢指数基金投资计划-201807(一补仓)
  • 原文地址:https://www.cnblogs.com/preacher/p/6084802.html
Copyright © 2011-2022 走看看