java字符串乱码处理

直接上代码了! 

package com.yt.eos.common.utils;

import java.io.UnsupportedEncodingException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;

/**
 * 乱码处理类
 * @author tyg
 * @date   2020年4月26日下午2:27:51
 */
public class MessyCodeUtil {

	public static void main(String[] args) throws UnsupportedEncodingException {
		System.out.println(decodeMessyCode("tyg"));
		System.out.println(decodeMessyCode("123"));
		System.out.println(decodeMessyCode("中国加油!"));
		System.out.println(decodeMessyCode("。。..&……%¥¥%"));
		System.out.println(decodeMessyCode("ç§äº"));
	}
	
	/**
	 * 解码
	 * 1、如果是乱码则解码后返回
	 * 2、如果不是乱码则直接返回
	 * 注:不是所有乱码都适用,只适用于IOS-8859-1编码的乱码
	 * @param str
	 * @return
	 * @throws UnsupportedEncodingException
	 * @author tyg
	 * @date   2020年4月26日下午2:21:07
	 */
	public static String decodeMessyCode(String str) throws UnsupportedEncodingException {
		if(StringUtils.isBlank(str)) {
			return str;
		}
		boolean isMessyCode = isMessyCode(str);
		if (isMessyCode) {
			return new String(str.getBytes("ISO-8859-1"), "UTF-8");
		}
		return str;
	}
	
    /**
     * 验证是否乱码
     * @param str
     * @return	true:乱码,false:不是乱码
     * @author tyg
     * @date   2020年4月26日下午2:18:26
     */
	public static boolean isMessyCode(String str) {
		if(StringUtils.isBlank(str)) {
			return false;
		}
		Pattern p = Pattern.compile("\\s*|t*|r*|n*");
        Matcher m = p.matcher(str);
        String after = m.replaceAll("");
        String temp = after.replaceAll("\\p{P}", "");
        char[] ch = temp.trim().toCharArray();
        float chLength = ch.length;
        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;
                }
            }
        }
        float result = count / chLength;
        if (result > 0.4) {
            return true;
        }
        return false;
	}
	
	/**
	 * 判断字符是否是中文
	 * @param c	字符
	 * @return	是否是中文
	 * @author tyg
	 * @date   2020年4月26日下午2:19:41
	 */
    public 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;
    }
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值