好久没有写点什么了。原因很简单,忙!近三个月几乎天天加班,基本没有消停过。工作的强度很大,但是没有压力;可是生活的强度并不大,却充斥的满满的。不想开篇就是牢骚满腹,但毕业生被作为廉价劳动力的滋味并不是很好受。今年我终于不再是应届毕业生了,话说我可以作为一个社会招聘去跳槽了吧?
今天要说的一个例子也是我在网上没有找到,而费了很长时间自己解决的。
例子:
一个字符串:”12345ABC陈陈陈陈12″
使用Java中substring(5,10) = “ABC陈陈” 。而substring(10,12) = “陈陈”,并且它是从第2个陈开始截取的。如果我用substring(5,16),应该会报错的。因为它是按照字符去截取的。但是,我不能按照字符去截取,我需要按照字节来。也就是说我期望的结果是:substring(5,10) = “ABC陈” substring(10,12) = “陈” 而它应该是从第一个陈开始截取的。substring(5,16) = “ABC陈陈陈陈”,似乎Java的方法中没有实现我这个需求的。
所以我只能自己想办法截取它。
需求:
一个长长的字符串,我要根据定义文件中的每个字段的位数去从头开始截取他们,然后一个个的赋值到字段中去。
思路:
从头开始截取,截完一段后,改变原字符串(即去掉截掉的部分)。然后对待上述文件中的全角字符的时候循环截取,直到截取到定义的长度为止。
下面是实现的截取方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
/** * subStr Methed * * @param Sreing 原字符串 * @param int 要截取的长度 * @return Vector返回集合包括截取的部分与剩余的部分 */ private static Vector<String> subStr(String rec, int columnLen) { String str = ""; int len = columnLen; Vector<String> vector = new Vector<String>(); if (StringUtils.isEmpty(rec)) { return vector; } while (true) { if (len <= rec.length()) { str = rec.substring(0, len); if (str.getBytes().length > columnLen) { //判断是不是要截取的字节长度,如果长,减小截取长度。 len--; } else { break; } } else if (columnLen <= rec.getBytes().length) { //判断是不是截取长度是不是超过了字符串长度。 len--; } else { return vector; } } vector.add(str); rec = rec.substring(len, rec.length()); vector.add(rec); return vector; } |
===========================================================================
附:话说公司一领导牛人用的是这样的方法,更简单且使用。在这里就些简单几句吧,不写整个逻辑块了。
1 2 |
byte[] recBytes = rec.getBytes(); //将字符串转换成byte数组。 String s = new String(recBytes, startIndex, splitLen); //利用String的这种方法生成截取的字符串,并放进早定义好的数组里。 |
感觉后面这种方法更好些,因为它可以应用在任何中间截取的应用场景。推荐一下!
注意:中文并不一定是占两个字节的,具体占多少字节是跟具体的编码方式相关的。
比如说:GB2312、GBK、GB18030 编码是占用两个字节的,但是 UTF-8 编码的话至少需要占用三个字节。
有一个简单方法,就是把大于 0xff 的字符都作为两个字符(当然是在 GBK 环境下)。