解决文件内容的中文乱码_字符集_字符编码_字符编码方案
生活随笔
收集整理的這篇文章主要介紹了
解决文件内容的中文乱码_字符集_字符编码_字符编码方案
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
從第三方下載的java源文件,打開查看里面的中文全部是亂碼,無論你使用什么字符編碼集都無法正常顯示,該文件是用UTF-8編碼存檔的,使用UTF-8解碼也同樣是亂碼,相信很多人遇到類似的問題,我這里解決過一個經典案例,大家看看,是不是可以給你們提供有用的思路呢?
java源文件的部分內容如下:
import com.htlwk.elts.util.Config;/*** êμì?êy?Y·??êàà* ′?ààóDá???1|?ü:* 1:?áè?2¢?a?????????t,??êy?Yò?êμì?ààμ?êμày±£′?* 2:?a????ààìá1?êy?Y(ìá1??àó|êy?Yμ?êμì?ààêμày).*/ public class EntityContext {private Config config;//ó?óú?áè?properties???tμ?àà/*** ê1ó?HashMap±£′??ùóDμ?ó??§???ó* key:ó??§μ?ID* value:??ó|′?ó??§μ?User???ó* ê1ó?HashMap±£′?μ?o?′|?úóú,?ù?Y3ìDòμ?Dè?ó??DD·???oó·¢??,μ±ó?* ?§ê?è?IDoí?ü????DDμ???ê±,?ò??????è???ó|?a??IDμ?ó??§ê±,ê1ó?* HashMap?üà?óú2é?ò′?ó??§(ê?è¥ê1ó?List?1Dè×??oD′±éàú?°?D??μ?* ???-,???òHashMap?éìá??2é?ˉD§?ê)*/private Map<Integer,User> users =new HashMap<Integer,User>();/*** key:??ìaμ???ò×?è(level)* value:??ó|???èμ?ò?×é??ìaList<Question>*/有經驗的程序員就是靠猜測,認為這很有可能是latin1編碼導致中文亂碼,而在國內很多程序員會使用GBK編碼存檔,而此文件曾經上傳到云盤保存過,所以大致的編碼路徑如下:
根據上圖的編碼路徑,我們寫段代碼檢驗下,是否能夠取到正確的Unicode編碼從而正常顯示中文字符,代碼如下:
package com.htlwk.day04.demo01;public class ErrorCodeConversion {static String s ="import com.htlwk.elts.util.Config;\n" +"\n" +"/**\n" +" * êμì?êy?Y·??êàà\n" +" * ′?ààóDá???1|?ü:\n" +" * 1:?áè?2¢?a?????????t,??êy?Yò?êμì?ààμ?êμày±£′?\n" +" * 2:?a????ààìá1?êy?Y(ìá1??àó|êy?Yμ?êμì?ààêμày).\n" +" */\n" +"public class EntityContext {\n" +" private Config config;//ó?óú?áè?properties???tμ?àà\n" +" /**\n" +" * ê1ó?HashMap±£′??ùóDμ?ó??§???ó\n" +" * key:ó??§μ?ID\n" +" * value:??ó|′?ó??§μ?User???ó\n" +" * ê1ó?HashMap±£′?μ?o?′|?úóú,?ù?Y3ìDòμ?Dè?ó??DD·???oó·¢??,μ±ó?\n" +" * ?§ê?è?IDoí?ü????DDμ???ê±,?ò??????è???ó|?a??IDμ?ó??§ê±,ê1ó?\n" +" * HashMap?üà?óú2é?ò′?ó??§(ê?è¥ê1ó?List?1Dè×??oD′±éàú?°?D??μ?\n" +" * ???\u00AD,???òHashMap?éìá??2é?ˉD§?ê)\n" +" */\n" +" private Map<Integer,User> users =\n" +" new HashMap<Integer,User>();\n" +" \n" +" /**\n" +" * key:??ìaμ???ò×?è(level)\n" +" * value:??ó|???èμ?ò?×é??ìaList<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總結
以上是生活随笔為你收集整理的解决文件内容的中文乱码_字符集_字符编码_字符编码方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软发布 Turing Bletchle
- 下一篇: Mimimi Games 即将关闭,《影