解决文件上传转化格式后还会乱码问题。

  当我们项目中使用客户端上传的文件进行解析,解析后插入数据库操作时,有一个非常头疼的问题,那就是乱码问题,因为你不知道客户端使用的什么编码格式,当然也可能用户会上传一个在本地乱码的文件,当我们如果读取文件时指定读取格式时也可能存在转码后乱码问题,特别是往数据库进行插入操作,这种问题是不可控的,因为我们不能保证读取的文件转成指定格式后还不乱码'

 这次我在项目中使用的是.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;  
            }  
        }  

}


如果有什么不合理,或者更好的方式处理,欢迎评论~

猜你喜欢

转载自blog.csdn.net/Qin_HongKun/article/details/79176186