使用java从乱码文本中解析出正确的文本

时间:2023-12-03 12:10:22 

这是一个可以从乱码文本中得到正确的原始文本的程序,其基于的原理在于错误的编码往往导致位补充,因此正确的文本使用的字节数应该是最少的(之一)。


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);
 }

}

标签:java,乱码
0
投稿

猜你喜欢

  • java设计模式之简单工厂模式简述

    2021-06-14 17:11:20
  • Android提醒微技巧你真的了解Dialog、Toast和Snackbar吗

    2023-03-08 14:15:44
  • 一步步实现Viewpager卡片翻页效果

    2022-10-15 02:14:25
  • C#编程实现自定义热键的方法

    2023-12-05 23:57:18
  • Android中分析Jetpack Compose动画内部的实现原理

    2021-06-13 05:23:02
  • 解决IDEA maven 项目修改代码不生效,mvn clean、install后才生效

    2022-06-19 12:17:06
  • Java基于IO流读取文件的方法

    2023-08-11 16:23:57
  • Android图片处理工具类BitmapUtils

    2022-12-28 05:23:39
  • Java中使用StackWalker和Stream API进行堆栈遍历

    2023-04-12 11:29:07
  • Android带进度条的文件上传示例(使用AsyncTask异步任务)

    2023-06-24 09:43:11
  • 基于WPF实现绘制地铁路线图

    2023-09-08 13:23:12
  • mybatis中<if>标签bool值类型为false判断方法

    2023-11-20 11:28:33
  • 关于maven:pom文件的使用解析

    2022-02-08 06:21:41
  • Android实现多线程断点下载

    2023-08-11 00:45:28
  • .Net Winform开发笔记(四)透过现象看本质

    2022-06-22 09:36:24
  • Kotlin Navigation可视化开发详解

    2022-10-18 10:55:56
  • 使用java生成字母验证码

    2021-10-29 23:50:25
  • Android中在GridView网格视图上实现item拖拽交换的方法

    2022-07-13 01:26:04
  • 使用Java操作TensorFlow的方法

    2023-11-27 21:31:38
  • Android NotificationListenerService 通知服务原理解析

    2022-03-29 05:34:29
  • asp之家 软件编程 m.aspxhome.com