A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Apol 中级黑马   /  2015-7-25 23:03  /  636 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Apol 于 2015-7-25 23:09 编辑
  1. <div class="blockcode"><blockquote>/**
  2. 编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表)
  3.         例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
  4. 思路:GBK编码中,一个字母占一个字节,切最高位为0;一个汉字占两个字节,最高位都为为1.
  5. */
  6. import java.util.*;

  7. class Test10
  8. {
  9.         public static void main(String[] args) throws Exception
  10.         {
  11.                 String str = "你好HM程序员";

  12.                 //c从str中截取前3个字节,并返回字符串
  13.                 String sub = backString(str, 3);
  14.                
  15.                 System.out.println(sub);
  16.         }
  17.        
  18.         //取字符创str的前n个字节的字符串
  19.         public static String backString(String str, int n) throws Exception
  20.         {
  21.                 //字符串转换为字节数组
  22.                 byte[] buf = str.getBytes("GBK");
  23.                
  24.                 //存储返回的子串
  25.                 String sub = null;
  26.                
  27.                 //记录每个字节的最高位
  28.                 StringBuilder sb = new StringBuilder(); //
  29.        
  30.                 for(byte b : buf)
  31.                 {
  32.                         String s = Integer.toBinaryString(b&128);
  33.                         char[] ch = s.toCharArray();
  34.                        
  35.                         sb.append(ch[0]);       
  36.                 }
  37.                 //System.out.println(sb);
  38.                
  39.                 //第n个字节的最高位
  40.                 char c = sb.charAt(n-1);       
  41.                 //System.out.println(c);
  42.                
  43.                 //如果第n个字节最高位为0,则返回前n个字节的字符串
  44.                 if(c == '0')
  45.                 {
  46.                         sub = new String(buf, 0, n, "GBK");
  47.                 }
  48.                
  49.                 //如果第n个字节最高位为1,则需要记录前n个字节最高位为1的个数count
  50.                 //count为偶数,则该字节只是一个中文字符的一部分,只需返回前n-1个字节的字符串形式
  51.                 //count为奇数,则第n-1个字节的最高位必也为1,这两个字节正好形成一个中文字符,返回前n个字节的字符串形式
  52.                 else
  53.                 {
  54.                         int count = 0;
  55.                         //记录'1'在sb中的第n个字符之前出现的次数
  56.                         char[] s1 = sb.toString().toCharArray();
  57.                        
  58.                         for(int i = 0; i < n-1 ; i++)
  59.                         {
  60.                                 if(s1[i] == '1')
  61.                                 {
  62.                                         count++;
  63.                                 }
  64.                         }
  65.                        
  66.                         if(count%2 == 0)
  67.                         {
  68.                                 sub = new String(buf, 0, n-1, "GBK");
  69.                         }
  70.                         else
  71.                         {
  72.                                 sub = new String(buf, 0, n, "GBK");
  73.                         }
  74.                 }
  75.                
  76.                 return sub;
  77.        
  78.         }
  79. }
复制代码


3 个回复

倒序浏览
可以不用记录前n-1个字节最高位为1的个数,可直接判断第n-1个字节的最高位是否为1,即:if(s1[n-2] == '1'),但是,当n=1时,判断不了,需要重新对n=1的情况进行判断。
回复 使用道具 举报
前途无量。。
回复 使用道具 举报
学习学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马