问题的起因
在项目终遇到了一个问题,我的程序是类似一个中间件的程序,负责转发上位机的数据到第三方程序进行处理,第三方程序将结果返回给我,经过我的程序处理再返回给上位机。
既然有这个需求,说明上位机程序和三方程序没有适配好传入参数和返回参数,所以需要我的程序来进行转换。这里就遇到了我今天要说的问题,关于中文字符和其他字符的字节占位问题(将一个字符串用空格填补到指定长度)。
字符占位
关于字符占位的问题,应该是老生常谈了,大家估计在大学课程中就常常碰到,请在一个字符串中筛选出汉字、数字、英文,如代码块1和代码块2所示,列举筛选汉字。
public static void main(String[] args) {
String str = " 真的爱学习abc,adad()() ";
System.out.println("过滤出汉字:" + str.replaceAll("\\s*","").replaceAll("[^(\\u4e00-\\u9fa5)]",""));
}
public static void main(String[] args) {
String str = " 真的爱学习22554这啊啊大擦是aacb ";
System.out.println("过滤出数字+字母:" + str.replaceAll("\\s*","").replaceAll("[^(a-zA-Z0-9)]",""));
}
我就是在这里上当了,注意这里说的是汉字,不是中文字符,所以如果你使用汉字的正则表达式,如果使用程序的客户从上位机传下来的数据带有类似‘(’、‘)’、‘【’等中文标点符号,就可能会出现填补位数不足,导致最后的结果出问题,所以我没需要适当地扩大范围(\u0391-\uffe5)。
public static void main(String[] args) {
String str = " 真的爱学习abc,adad()() ";
System.out.println("过滤出汉字:" + str.replaceAll("\\s*","").replaceAll("[^(\\u0391-\\uffe5)]",""));
}
这样就不会出现中文符号没有被统计到的情况,因为中文符号是占两个字节,而其他字符一般情况下是占一个字节。
wu~~~~~~~~yo