从第三方下载的java源文件,打开查看里面的中文全部是乱码,无论你使用什么字符编码集都无法正常显示,该文件是用UTF-8编码存档的,使用UTF-8解码也同样是乱码,相信很多人遇到类似的问题,我这里解决过一个经典案例,大家看看,是不是可以给你们提供有用的思路呢?
java源文件的部分内容如下:
import com.htlwk.elts.util.Config;/*** ʵÌåÊý¾Ý·ÃÎÊÀà* ´ËÀàÓÐÁ½¸ö¹¦ÄÜ:* 1:¶ÁÈ¡²¢½âÎöÅäÖÃÎļþ,½«Êý¾ÝÒÔʵÌåÀàµÄʵÀý±£´æ* 2:ΪÆäËûÀàÌṩÊý¾Ý(ÌṩÏàÓ¦Êý¾ÝµÄʵÌåÀàʵÀý).*/
public class EntityContext {private Config config;//ÓÃÓÚ¶ÁÈ¡propertiesÎļþµÄÀà/*** ʹÓÃHashMap±£´æËùÓеÄÓû§¶ÔÏó* key:Óû§µÄID* value:¶ÔÓ¦´ËÓû§µÄUser¶ÔÏó* ʹÓÃHashMap±£´æµÄºÃ´¦ÔÚÓÚ,¸ù¾Ý³ÌÐòµÄÐèÇó½øÐзÖÎöºó·¢ÏÖ,µ±ÓÃ* »§ÊäÈëIDºÍÃÜÂë½øÐеǼʱ,ÎÒÃÇÏë»ñÈ¡¶ÔÓ¦Õâ¸öIDµÄÓû§Ê±,ʹÓÃ* HashMap¸üÀûÓÚ²éÕÒ´ËÓû§(ʡȥʹÓÃList»¹Ðè×Ô¼ºÐ´±éÀú¼°ÅжϵÄ* Âß¼,¶øÇÒHashMap¿ÉÌá¸ß²éѯЧÂÊ)*/private Map<Integer,User> users =new HashMap<Integer,User>();/*** key:¿¼ÌâµÄÄÑÒ׶È(level)* value:¶ÔÓ¦ÄѶȵÄÒ»×鿼ÌâList<Question>*/
有经验的程序员就是靠猜测,认为这很有可能是latin1编码导致中文乱码,而在国内很多程序员会使用GBK编码存档,而此文件曾经上传到云盘保存过,所以大致的编码路径如下:
根据上图的编码路径,我们写段代码检验下,是否能够取到正确的Unicode编码从而正常显示中文字符,代码如下:
package com.htlwk.day04.demo01;public class ErrorCodeConversion {static String s ="import com.htlwk.elts.util.Config;\n" +"\n" +"/**\n" +" * ʵÌåÊý¾Ý·ÃÎÊÀà\n" +" * ´ËÀàÓÐÁ½¸ö¹¦ÄÜ:\n" +" * 1:¶ÁÈ¡²¢½âÎöÅäÖÃÎļþ,½«Êý¾ÝÒÔʵÌåÀàµÄʵÀý±£´æ\n" +" * 2:ΪÆäËûÀàÌṩÊý¾Ý(ÌṩÏàÓ¦Êý¾ÝµÄʵÌåÀàʵÀý).\n" +" */\n" +"public class EntityContext {\n" +" private Config config;//ÓÃÓÚ¶ÁÈ¡propertiesÎļþµÄÀà\n" +" /**\n" +" * ʹÓÃHashMap±£´æËùÓеÄÓû§¶ÔÏó\n" +" * key:Óû§µÄID\n" +" * value:¶ÔÓ¦´ËÓû§µÄUser¶ÔÏó\n" +" * ʹÓÃHashMap±£´æµÄºÃ´¦ÔÚÓÚ,¸ù¾Ý³ÌÐòµÄÐèÇó½øÐзÖÎöºó·¢ÏÖ,µ±ÓÃ\n" +" * »§ÊäÈëIDºÍÃÜÂë½øÐеǼʱ,ÎÒÃÇÏë»ñÈ¡¶ÔÓ¦Õâ¸öIDµÄÓû§Ê±,ʹÓÃ\n" +" * HashMap¸üÀûÓÚ²éÕÒ´ËÓû§(ʡȥʹÓÃList»¹Ðè×Ô¼ºÐ´±éÀú¼°ÅжϵÄ\n" +" * Âß¼\u00AD,¶øÇÒHashMap¿ÉÌá¸ß²éѯЧÂÊ)\n" +" */\n" +" private Map<Integer,User> users =\n" +" new HashMap<Integer,User>();\n" +" \n" +" /**\n" +" * key:¿¼ÌâµÄÄÑÒ׶È(level)\n" +" * value:¶ÔÓ¦ÄѶȵÄÒ»×鿼ÌâList<Question>\n" +" */";public static void main(String[] args) {if (s != null){try{int length = s.length();byte[] buffer = new byte[length];//0x81 to Unicode 0x0081, 0x8d to 0x008d, 0x8f to 0x008f, 0x90 to 0x0090, and 0x9d to 0x009d.for (int i = 0; i < length; ++i){char c = s.charAt(i);if (c == 0x0081){buffer[i] = (byte) 0x81;} else if (c == 0x008d) {buffer[i] = (byte) 0x8d;} else if (c == 0x008f) {buffer[i] = (byte) 0x8f;} else if (c == 0x0090) {buffer[i] = (byte) 0x90;} else if (c == 0x009d) {buffer[i] = (byte) 0x9d;} else {buffer[i] = Character.toString(c).getBytes("latin1")[0]; // 使用latin1编码,得到GBK编码}}String result = new String(buffer, "GBK"); // 使用GBK解码得到正确Unicode编码System.out.println(result);} catch (Exception e) {e.printStackTrace();}}}}
执行程序后得到结果如下:
import com.htlwk.elts.util.Config;/*** 实体数据访问类* 此类有两个功能:* 1:读取并解析配置文件,将数据以实体类的实例保存* 2:为其他类提供数据(提供相应数据的实体类实例).*/
public class EntityContext {private Config config;//用于读取properties文件的类/*** 使用HashMap保存所有的用户对象* key:用户的ID* value:对应此用户的User对象* 使用HashMap保存的好处在于,根据程序的需求进行分析后发现,当用* 户输入ID和密码进行登录时,我们想获取对应这个ID的用户时,使用* HashMap更利于查找此用户(省去使用List还需自己写遍历及判断的* 逻辑,而且HashMap可提高查询效率)*/private Map<Integer,User> users =new HashMap<Integer,User>();/*** key:考题的难易度(level)* value:对应难度的一组考题List<Question>*/Process finished with exit code 0