本帖最后由 caixingke 于 2014-9-29 15:44 编辑
我当时做的也是这一个题, 我向黑马提交的代码就是下面这个:
- public class Test10 {
- /*
- * 从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
- * 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,
- * 截取3个字节也要是"HM"而不要出现半个中文
- *
- * 代码思路:
- * 我们从第0个字节开始读,
- * 如果一个字节在0x00-0x7F之间, 则我们认为是单字节字符, 那么我们count++继续读下一个字节.
- * 如果一个字节不在 0x00-0x7F范围内, 则我们认为是双字节字符, count+=2继续读下去.
- * 一直到读完这个缓冲区为止.
- */
- public static byte[] getBytesFromGBKBuffer(byte[] gbkBuffer, int length) {
- try {
- if (gbkBuffer == null || length <= 0) { // 输入不合法, 抛出异常
- throw new Exception("输入不合法");
- } else if (length >= gbkBuffer.length) { // 长度越过这个字串本有的长度, 则直接返回
- byte[] buffer = new byte[length];
- System.arraycopy(gbkBuffer, 0, buffer, 0, length);
- return buffer;
- } else {
- int count = 0; // 用来指向当前在哪一个字节
- while (true) {
- // 如果一个字节在0x00-0x7F之间, 我们判断其是单字节字符, 否则其被认为是双字节字符
- // 对于补码为0x80-0xFF的, 其是负数, 小于0.
- if ((int) gbkBuffer[count] < 0x80
- && (int) gbkBuffer[count] > 0x00) { // 如果是单字节
- if (count == length - 1) {
- // gbkBuffer[count]已经是我们要取得的最后一个字符了, 所以直接返回.
- break;
- } else {
- // 因为不是最后一个字节, 所以继续
- // 因为当前这个字符是一个单字节字符, 所以用count++来取下一个字符的首字节.
- count++;
- }
- } else {
- if (count == length - 1) {
- // 如果当前字节是最后一个字节, 但因为当前字符是双字节字符,
- // 所以为了保持完整性, 不要掉这个字符, count回退.
- count--;
- break;
- } else if (count == length - 2) {
- // 如果单前这个字符达到了所要求的长度, 那么就退出.
- // 因为当前字符是双字节, 所以count应再往前移动一格.
- count++;
- break;
- } else {
- // 因为当前这个字符是双字节字符, 所以这里加2来取下一个字符的首字节.
- count += 2;
- }
- }
- }
- // 把buffer做为返回值来返回.
- int len = count + 1;
- byte[] buffer = new byte[len];
- System.arraycopy(gbkBuffer, 0, buffer, 0, len);
- return buffer;
- }
- } catch (Exception e) {
- System.err.println(e.getMessage());
- e.printStackTrace();
- return null;
- }
- }
- public static void main(String[] args) {
- // 测试用例
- try {
- String s = "TM黑马";
- // =========================
- byte[] a = getBytesFromGBKBuffer(s.getBytes("GBK"), 3);
- System.out.println(new String(a, "GBK")); // 打印: TM
- // =========================
- byte[] b = getBytesFromGBKBuffer(s.getBytes("GBK"), 4);
- System.out.println(new String(b, "GBK")); // 打印: TM黑
- // =========================
- byte[] c = getBytesFromGBKBuffer(s.getBytes("GBK"), 5);
- System.out.println(new String(c, "GBK")); // 打印: TM黑
- // ==========================
- byte[] d = getBytesFromGBKBuffer(s.getBytes("GBK"), 6);
- System.out.println(new String(d, "GBK")); // 打印: TM黑马
- // =========================
- } catch (UnsupportedEncodingException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
复制代码
|