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

 更新时间:2026年03月26日 09:16:55   作者:刘大猫.  
这篇文章主要为大家详细介绍了如何使用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]*");
}

工作原理:

  • 正则表达式[\\x20-\\x7E]*匹配所有ASCII可打印字符(空格到波浪号)
  • 如果字符串完全由这些字符组成,返回false(不是乱码)
  • 否则返回true(认为是乱码) 

二、代码

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如何判断字符串是否有乱码

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

  • 指定编码:确定我们期望使用的字符编码( UTF-8、GBK等等)。
  • 验证编码:尝试将字符串编码为字节数组,然后再以相同编码解码回来,最后检查解码后的结果是否与原始字符串一致。
  • 检测非法字符:对字符串进行逐字符检查,判断是否存在未能正确解码的字符。
  • 返回结果:根据上述判断结果输出是否存在乱码。

代码示例

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("字符串无乱码");
        }
    }
}

代码解析

  • hasGarbage方法:此方法负责判断输入的字符串是否有乱码。首先,输入参数为待验证的字符串和字符编码。
  • 编码与解码:使用getBytes方法将字符串转换为字节数组,再用new String构造函数基于相同字符集进行解码。
  • 比较原字符串与解码字符串:若两者不相等,则表示存在乱码。
  • 异常处理:在处理时对可能出现的异常进行捕获,并返回有乱码的结果。

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

相关文章

  • SpringBoot工程Docker多环境中使用同一个Jar包解决方案

    SpringBoot工程Docker多环境中使用同一个Jar包解决方案

    在Docker多环境部署中,SpringBoot工程可以通过环境变量来动态改变配置,无需重新打包,利用volume挂载或docker cp命令,可以将配置文件直接传入容器,提高部署效率,并保证安全性
    2024-09-09
  • IDEA解决springboot热部署失效问题(推荐)

    IDEA解决springboot热部署失效问题(推荐)

    热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。这篇文章主要介绍了IDEA解决springboot热部署失效问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Spring的CorsFilter会失效的原因及解决方法

    Spring的CorsFilter会失效的原因及解决方法

    众所周知CorsFilter是Spring提供的跨域过滤器,我们可能会做以下的配置,基本上就是允许任何跨域请求,我利用Spring的CorsFilter做跨域操作但是出现报错,接下来小编就给大家介绍一Spring的CorsFilter会失效的原因及解决方法,需要的朋友可以参考下
    2023-09-09
  • SpringBoot 中的异步处理机制详解

    SpringBoot 中的异步处理机制详解

    本文介绍了异步处理的基础配置、线程池的自定义以及常见应用场景,在实际应用中,异步处理可以有效提升应用的性能,改善用户体验,但同时也需要我们合理管理线程池,确保系统资源的高效利用,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • Mybatis枚举类型转换源码分析

    Mybatis枚举类型转换源码分析

    在Mybatis的TypeHandlerRegistry中,添加了常用的类转换器,其中默认的枚举类型转换器是EnumTypeHandler,这篇文章主要介绍了Mybatis枚举类型转换源码分析,需要的朋友可以参考下
    2024-05-05
  • Java数据结构之顺序表和链表精解

    Java数据结构之顺序表和链表精解

    我在学习完顺序表后一直对顺序表和链表的概念存在一些疑问,这里给出一些分析和看法,通读本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下
    2021-09-09
  • 如何在Java中调用python文件执行详解

    如何在Java中调用python文件执行详解

    丰富的第三方库使得python非常适合用于进行数据分析,最近在项目中就涉及到java调用python实现的算法,下面这篇文章主要给大家介绍了关于如何在Java中调用python文件执行的相关资料,需要的朋友可以参考下
    2022-05-05
  • 详解Spring Aop实例之AspectJ注解配置

    详解Spring Aop实例之AspectJ注解配置

    本篇文章主要介绍了详解Spring Aop实例之AspectJ注解配置,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • SpringBoot实现接口防抖的实战方案大全

    SpringBoot实现接口防抖的实战方案大全

    这篇文章主要介绍了四种在SpringBoot中实现接口防抖的方案,包括前端防抖+后端令牌锁、数据库唯一约束、本地Guava缓存和Token令牌机制,每种方案都有其优缺点,选择时应根据业务重要性和系统架构来决定,需要的朋友可以参考下
    2025-12-12
  • spring定时任务(scheduler)的串行、并行执行实现解析

    spring定时任务(scheduler)的串行、并行执行实现解析

    这篇文章主要介绍了spring定时任务(scheduler)的串行、并行执行实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09

最新评论