当我们项目中使用客户端上传的文件进行解析,解析后插入数据库操作时,有一个非常头疼的问题,那就是乱码问题,因为你不知道客户端使用的什么编码格式,当然也可能用户会上传一个在本地乱码的文件,当我们如果读取文件时指定读取格式时也可能存在转码后乱码问题,特别是往数据库进行插入操作,这种问题是不可控的,因为我们不能保证读取的文件转成指定格式后还不乱码'
这次我在项目中使用的是.csv格式的文件进行上传解析,当使用Excel创建xlsx格式文件后重命名成csv格式后[可能有人问为啥不直接创建cvs,一般用户会这样操作~],本地打开文件正常上传到服务器转成utf-8还会乱码,只有另存为cvs格式的文件上传才正常,所以这种乱码的数据不能插入数据库咯,为此在网上找了一个判断乱码的方法,特此共享出来。
package test.qhk.main;
import test.qhk.utils.MessyCodelUtils;
public class MessyCodeMain {
public static void main(String[] args) {
String[] codes = {"测试乱码",
"نوله ",
"役瑥阿긺",
"æµè¯"};
for (int i = 0; i < codes.length; i++) {
if(MessyCodelUtils.isMessyCode(codes[i])){
System.out.println(String.format("数组索引 %s 将产生乱码", i));
}
}
}
}
package test.qhk.utils; import java.util.regex.Matcher; import java.util.regex.Pattern; public class MessyCodelUtils { /** *注:这是网上找到识别乱码方法 */ private static boolean isChinese(char c) { Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) { return true; } return false; } /** * <h4>功能:[判断是否乱码][2018年1月19日 下午12:03:40][创建人:qinhongkun]</h4> * <h4></h4> * @param content * @return */ public static boolean isMessyCode(String strName) { Pattern p = Pattern.compile("\\s*|\t*|\r*|\n*"); Matcher m = p.matcher(strName); String after = m.replaceAll(""); String temp = after.replaceAll("\\p{P}", ""); char[] ch = temp.trim().toCharArray(); float chLength = 0 ; float count = 0; for (int i = 0; i < ch.length; i++) { char c = ch[i]; if (!Character.isLetterOrDigit(c)) { if (!isChinese(c)) { count = count + 1; } chLength++; } } float result = count / chLength ; if (result > 0.4) { return true; } else { return false; } } }如果有什么不合理,或者更好的方式处理,欢迎评论~