当我们项目中使用客户端上传的文件进行解析,解析后插入数据库操作时,有一个非常头疼的问题,那就是乱码问题,因为你不知道客户端使用的什么编码格式,当然也可能用户会上传一个在本地乱码的文件,当我们如果读取文件时指定读取格式时也可能存在转码后乱码问题,特别是往数据库进行插入操作,这种问题是不可控的,因为我们不能保证读取的文件转成指定格式后还不乱码'
这次我在项目中使用的是.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;
}
}
}
如果有什么不合理,或者更好的方式处理,欢迎评论~