要求报文限定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);
优点是比较现成,缺点是用别人的类库,不易改造,例如想要知道哪个字符错了,改造比较麻烦(代码封装的太深了,有点看不懂)。