java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java字符串判断

java代码实现判断字符串是否为乱码

作者:刘大猫.

这篇文章主要为大家详细介绍了如何使用java代码实现判断字符串是否为乱码,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下

一、介绍

字符串乱码检测:一个简单但局限的实现方案

这段代码实现了一个基于ASCII可打印字符范围的乱码检测函数,通过正则表达式判断字符串是否包含非标准ASCII字符。

public static boolean isGarbage(String str) {
    //检查字符串是否为空
    if (str == null I str.isEmpty()) {
        return true;//认为空字符串是乱码
    }
    //使用正则表达式检查字符串是否只包含可打印字符
    //可打印字符范围:0x20(space)到0x7E(tide)
    return !str.matches("[\\x20-\\x7E]*");
}

工作原理:

二、代码

public class StringUtils {

    // 判断字符串是否为乱码
    public static boolean isGarbage(String str) {
        // 检查字符串是否为空
        if (str == null || str.isEmpty()) {
            return true; // 认为空字符串是乱码
        }

        // 使用正则表达式检查字符串是否只包含可打印字符
        // 可打印字符范围: 0x20 (space) 到 0x7E (tilde)
        // 这里可以根据实际需求调整
        return !str.matches("[\\x20-\\x7E]*");
    }

    public static void main(String[] args) {
        String test1 = "�����������"; // 乱码
        String test2 = "W1111A1111"; // 正常字符串

        System.out.println("Test 1 is garbage: " + isGarbage(test1)); // true
        System.out.println("Test 2 is garbage: " + isGarbage(test2)); // false
    }
}

三、方法补充

1.java判断字符串是否为乱码

java.nio.charset.Charset.forName("GBK").newEncoder().canEncode("测试") //判断是不是GBK编码 即是否乱码
//使用request.getQueryString()获取通过URL传过来的值 有可能是乱码 如:q=鿥
String s = request.getQueryString();
if(s!=null){
    if(!(java.nio.charset.Charset.forName("GBK").newEncoder().canEncode(s))){
        try {
            s = new String(request.getQueryString().getBytes("ISO-8859-1"),"UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

2.Java判断文字是否乱码

该代码段提供了一个Java方法,用于检测字符串是否包含乱码。它首先去除字符串中的空白字符和标点符号,然后判断剩余字符是否为数字、英文或中日韩文字。如果非这些字符的比例超过40%,则认为字符串包含乱码。

/**
	 * 判断字符串是否是乱码
	 *
	 * @param strName 字符串
	 * @return 是否是乱码
	 */
	public static boolean isMessyCode(String strName) {
		float count = 0;
		//去除字符串中的空格 制表符 换行 回车
		Pattern p = Pattern.compile("\\s*|\t*|\r*|\n*");
		Matcher m = p.matcher(strName);
		String after = m.replaceAll("");
		//去除字符串中的标点符号
		String temp = after.replaceAll("\\p{Punct}", "").replaceAll("“|”|!|:|,|?|、|…|\\+","").replaceAll(" ","").replaceAll("\\s\\S*","");
		//处理之后转换成字符数组
		char[] ch = temp.trim().toCharArray();
		for (int i = 0; i < ch.length; i++) {
			char c = ch[i];
			//判断是否是数字或者英文字符
			if (!judge(c)) {
				//判断是否是中日韩文
				if (!isChinese(c)) {
					//如果不是数字或者英文字符也不是中日韩文则表示是乱码返回true
					//System.out.println(c);
					count++;
				}
			}
		}
		float rate = count/ch.length;
		if(rate>0.4){
			return true;
		}
		//表示不是乱码 返回false
		return false;
	}
	public static boolean judge(char c){
		if((c >='0' && c<='9')||(c >='a' && c<='z' ||  c >='A' && c<='Z')){
			return true;
		}
		return false;
	}
    /**
     * 判断是否是中日韩文字
     * @param c     要判断的字符
     * @return      true或false
     */
    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;
    }

3.java如何判断字符串是否有乱码

要判断字符串是否有乱码,我们可以依据以下几个步骤:

代码示例

import java.nio.charset.Charset;
public class StringValidator {
    /**
     * 根据指定编码判断字符串是否有乱码
     *
     * @param str    待检测的字符串
     * @param charsetName 指定的字符编码
     * @return       如果字符串有乱码返回true,反之返回false
     */
    public static boolean hasGarbage(String str, String charsetName) {
        if (str == null || charsetName == null) {
            return false; // null 时不判断
        }
        Charset charset = Charset.forName(charsetName);
        try {
            // 将字符串编码为字节数组
            byte[] bytes = str.getBytes(charset);
            // 用相同的编码解码
            String decodedStr = new String(bytes, charset);
            // 判断原字符串和解码后的字符串是否一致
            return !str.equals(decodedStr);
        } catch (Exception e) {
            e.printStackTrace();  // 输出异常信息
            return true; // 捕获异常时认为有乱码
        }
    }
    public static void main(String[] args) {
        String testStr = "测试字符串"; // 需要测试的字符串
        String charset = "UTF-8"; // 可选的编码格式
        boolean result = hasGarbage(testStr, charset);
        if (result) {
            System.out.println("字符串存在乱码");
        } else {
            System.out.println("字符串无乱码");
        }
    }
}

代码解析

到此这篇关于java代码实现判断字符串是否为乱码的文章就介绍到这了,更多相关java字符串判断内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文