简单的代码,简单的逻辑,bug肯定存在,但以我的智商还没有更好的办法,如果谁有更好的算法欢迎赐教。
package com.hongyuan.test; import java.io.UnsupportedEncodingException; /* * 这是一个可以从乱码文本中得到正确的原始文本的程序,其基于的原理在于错误的编码往往导致位补充, * 因此正确的文本使用的字节数应该是最少的(之一)。 * * 如果你在测试此程序时,无法得到正确的文本,可能的原因如下: * 1.此程序仅能从一次错误编码文本中得到原始文本,无法从多次错误编码中恢复文本。 * 2.有时错误的编码导致一些字符变为不可见字符,你可能没有把所有的乱码文本拷贝过来,从而导致位缺失。这种情况下无法恢复文本。 * 3.原始文本是一个比较大的字符集,错误的编码使用小的字符集,那些在小字符集之外的字符信息丢失,无法从中解析正确的文本。 * 4.恭喜你中奖了,有一些字符使用任何一种编码没有什么不同或者错误的编码没有导致位补充,那么我也无能为力了。(这种情况确实很少见) * * 注:程序中的乱码文本是将百度首页(utf-8)调整为gbk(显然会乱码)得到的,有兴趣的同志可以使用其他的乱码测试。有问题欢迎回复。 */ public class CharSetTest { public static final String[] CHARSET_NAMES=new String[]{"ISO8859-1","GBK","UTF-8"}; public static void main(String[] args) throws UnsupportedEncodingException { //乱码字符串 String str="寰蒋鐧惧害鍏辨帹Windows XP鑱斿悎闃叉姢瑙e喅鏂规"; int strLength=Integer.MAX_VALUE; //字符长度 String newStr=""; //从乱码字符串分析出的字符串 String srcCharSet=""; //当前乱码字符串编码 String targetCharSet=""; //乱码字符串正确的编码 //遍历可能的编码组合,从中造成编码长度最小的编码格式 for(int i=0;i<CHARSET_NAMES.length;i++){ for(int j=0;j<CHARSET_NAMES.length;j++){ String temp=new String(str.getBytes(CHARSET_NAMES[i]),CHARSET_NAMES[j]); //System.out.println(temp); if(temp.length()<=strLength){ strLength=temp.length(); newStr=temp; srcCharSet=CHARSET_NAMES[i]; targetCharSet=CHARSET_NAMES[j]; } } } //输出查询到的编码及正确文本格式 System.out.println(srcCharSet+"-->"+targetCharSet+":"+newStr); } }