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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蔡锐 中级黑马   /  2015-7-26 08:04  /  435 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package com.itheima;

  2. import java.io.UnsupportedEncodingException;
  3. import java.util.Scanner;

  4. /*
  5. * 10、编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文
  6. * (GBK码表),例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,
  7. * 截取3个字节也要是"HM"而不要出现半个中文
  8. *
  9. * 思路:
  10. * 将字符串转换成字节数组存储
  11. * 对要进行截取的部分统计负值个数
  12. * 如果负数个数为单数,那么为半个中文,舍弃,返回-1之前的数,转换成字符串输出
  13. * 否则为一个中文,转换成字符串输出
  14. */
  15. public class Test10 {
  16.         public static void main(String[] args) throws UnsupportedEncodingException  {
  17. //                while (true) {
  18.                         Scanner sc = new Scanner(System.in);
  19.                         System.out.print("请输入字符串:");
  20.                         String str = sc.nextLine();
  21.                         System.out.println("请输入要截取的字节数:");
  22.                         int len = sc.nextInt();
  23.                         System.out.println(subStr(str, len));
  24. //                }
  25.         }

  26.         private static String subStr(String str, int len) throws UnsupportedEncodingException {
  27.                 if (str == null && "".equals(str)) {
  28.                         return null;
  29.                 }
  30.                 // 将字符串中的char数组转换成指定编码方式的byte数组的函数
  31.                 byte[] strBytes = null;
  32.                         strBytes = str.getBytes("GBK");
  33.                 // 得到字符串的长度,判断截取字符串的长度是否在判断的范围内,否则返回原串
  34.                 if (len >= strBytes.length || len < 1) {
  35.                         return str;
  36.                 }
  37.                 int count = 0;
  38.                 for (int i = 0; i < len; i++) {
  39.                         // 将每个字节数组转换为整型数,以为后面根据值的正负来判断是否为汉字
  40.                         int value = strBytes[i];
  41.                         // 如果是汉字(负),则统计截取字符串中的汉字所占字节数
  42.                         if (value < 0)
  43.                                 count++;                       
  44.                 }
  45.                         if(count%2==0)//解码。如果为单数就是半个中文,要舍弃最后的数
  46.                                 return new String(strBytes,0,len,"GBK");
  47.                         else
  48.                                 return new String(strBytes,0,len-1,"GBK");

  49.         }
  50. }
复制代码

6 个回复

倒序浏览
准确说是基础测试题
回复 使用道具 举报
原来中文转换成字节形式都是负数,而且是两字节表示,受教了。
回复 使用道具 举报
原来如此。
回复 使用道具 举报
。。感谢大神。。我也查到用法。。
回复 使用道具 举报
感谢大神的分享
回复 使用道具 举报
感谢分享                           
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马