java判断是否包含非gbk字符

文章介绍了如何使用Java进行GBK和GB2312字符编码的判断,包括基础的等价比较和错误字符串的检测。提供了一种通过`Charset`类进行编码检测的方法,但指出其不便进行详细错误信息的获取。
摘要由CSDN通过智能技术生成

要求报文限定gbk或GB2312字符。
如何判断呢?

用基础java代码来实现

原理:

if (s.equals(new String(s.getBytes("GBK"), "GBK"))) { 
    flag=true;
} else {
    flag=false;
}

错误代码:

注:网上有的代码如下,也就是少了后面的"GBK",这样编译虽然不会报错,但是结果不对。
if (s.equals(new String(s.getBytes("GBK")))) {
}

只判断是否合规:

public static boolean isGBK(String s) {
    try {
        logger.info("isGBK方法开始,入参:", s);
        boolean flag = false;
        if (s.equals(new String(s.getBytes("GBK"), "GBK"))) {
            flag=true;
        } else {
            flag=false;
        }
        logger.info("isGBK方法完成,isGBK:{}", flag);
        return flag;
    } catch (Exception e) {
        logger.error("isGBK方法异常,error:", e);
        return false;
    }
}

判断并返回错误的字符串。
就是将string拆分为字符,再循环判断,有错的存入buffer并返回。

public static JsonResult isGBKAndGet(String s) {
    try {
        logger.info("isGBKAndGet方法开始,入参:", s);
        JsonResult result = new JsonResult();
        char[] charArray = s.toCharArray();
        String item=null;
        StringBuffer errorBuffer=new StringBuffer();
        for (char c: charArray){
            item = new String(Character.toString(c));
            if (item.equals(new String(item.getBytes("GBK"), "GBK"))) {

            } else {
                errorBuffer.append(item);
            }
        }
        if(!StringUtils.isEmpty(errorBuffer)){
            result=JsonResult.error("-1",errorBuffer.toString());
        }

        logger.info("isGBKAndGet方法完成,result:{}", JSON.toJSONString(result));
        return result;
    } catch (Exception e) {
        logger.error("isGBKAndGet方法异常,error:", e);
        return JsonResult.error("-1",e.getMessage());
    }
}

当然还可以进一步扩展,例如入参支持不同编码类型,都是可以的。

使用nio的工具类

用java.nio.charset的Charset类即可。

boolean flag = Charset.forName("GB2312").newEncoder().canEncode("张三阿什拉夫静安寺懂法守法");
logger.info("flag:{}",flag);

优点是比较现成,缺点是用别人的类库,不易改造,例如想要知道哪个字符错了,改造比较麻烦(代码封装的太深了,有点看不懂)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值