Text文檔編碼識別方法
在做文檔讀取的時候,時常碰到編碼格式不正確的問題,而要怎么樣正確識別文檔的編碼格式,成了很多程序員的一塊心病,今天我就要試著治好這塊心病,這段代碼的濃縮來自上千萬文檔的數(shù)據(jù)分析所得,可靠率極其高。
應(yīng)朋友要求,需要幫他做一個文章操作工具,既然想操作,就有文件的讀取和修改,本來花費幾個小時信心滿滿把程序交給朋友的時候,朋友突然來了句,很多文章打開出現(xiàn)亂碼的情況,我哩個去,像是晴天霹靂深深的擊在我的心窩里,我突然想到了文件編碼問題,而這個問題,我曾經(jīng)無數(shù)次的嘗試,最終都以失敗而告終,每次嘗試,只不過是減少了錯誤概率的出現(xiàn),但是還不足以彌補文件編碼格式分析完全的正確,而這次,朋友又提出來編碼問題,我瞬間凌亂了。
如果不把這個問題解決,給朋友做的工具等于沒有任何作用,我TM前兩天還吃人家一頓大餐,難道還能吐出來嗎?這個搞不定,面子就丟大了,無奈之下,我詢問了朋友那里有多少文件?得到答復(fù):好幾千萬。瞬間我眼光放亮了,那就海量數(shù)據(jù)分析吧。
海量數(shù)據(jù)分析的時候,我使用的是一個笨方法,就是把所有文件頭數(shù)據(jù)讀取出來,比如讀取4個byte,然后將讀取的文件內(nèi)容的前一百個字以(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這些做排序,因為可識別的字符編碼有一定的區(qū)間范圍,做排序后,可識別漢字的一定都堆在一起;
再有就是可以對 ch0,ch1,ch2,ch3,做詳細分類,看看它們之間都有什么樣的關(guān)系,通過觀察,我也是能發(fā)現(xiàn)什么的;通過歸納和總結(jié),就得出了TEXT編碼的可識別方法,如下: