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字符串判断内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java日常练习题,每天进步一点点(47)

    Java日常练习题,每天进步一点点(47)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-08-08
  • 在Java和PostgreSQL枚举之间转换的通用方法

    在Java和PostgreSQL枚举之间转换的通用方法

    枚举类型(enum)是一种方便的数据类型,允许我们指定一个常量列表,对象字段或数据库列可以设置为该列表中的值,在本文中,我将回顾处理Java和PostgreSQL枚举转换的通用方法,需要的朋友可以参考下
    2023-10-10
  • MybatisPlus使用idworker解决雪花算法重复

    MybatisPlus使用idworker解决雪花算法重复

    本文主要介绍了MybatisPlus使用idworker解决雪花算法重复,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Spring Boot中使用Actuator的/info端点输出Git版本信息

    Spring Boot中使用Actuator的/info端点输出Git版本信息

    这篇文章主要介绍了Spring Boot中使用Actuator的/info端点输出Git版本信息,需要的朋友可以参考下
    2017-06-06
  • 学习Java内存模型JMM心得

    学习Java内存模型JMM心得

    这篇文章主要介绍了学习Java内存模型JMM的心得以及对其原理做了深入的介绍,有兴趣的朋友学习下吧。
    2017-12-12
  • javaweb项目入门实战详细指南

    javaweb项目入门实战详细指南

    Java Web开发是指使用Java技术来创建动态网站或Web应用程序,Java Web开发主要使用Servlet、JSP(JavaServer Pages)、JavaBeans等技术来实现动态页面和处理业务逻辑,这篇文章主要介绍了javaweb项目入门的相关资料,需要的朋友可以参考下
    2025-12-12
  • Spring Boot管理用户数据的操作步骤

    Spring Boot管理用户数据的操作步骤

    SpringBoot结合Thymeleaf模板引擎,可以快速搭建Web应用,介绍了使用SpringBoot处理JSON数据的基本过程,包括创建实体类、视图页面和控制器,通过这些步骤,即可完成基于SpringBoot和Thymeleaf的简单Web开发,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • SpringBoot中使用Knife4J的解决方案

    SpringBoot中使用Knife4J的解决方案

    knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,这篇文章主要介绍了SpringBoot中使用Knife4J,需要的朋友可以参考下
    2022-10-10
  • java中实现分页的几种常见方式总结

    java中实现分页的几种常见方式总结

    在项目中经常会查询大量数据,这就要用到分页展示,下面这篇文章主要给大家介绍了关于java中实现分页的几种常见方式,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • spring boot使用sharding jdbc的配置方式

    spring boot使用sharding jdbc的配置方式

    这篇文章主要介绍了spring boot使用sharding jdbc的配置方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12

最新评论