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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表)

例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文

7 个回复

倒序浏览
这个不太懂,呵呵
回复 使用道具 举报
public void getStringbybit(String str, int byteLength) {
  String strs[] = str.split("");
  int hasRead = 0; // 已读取的字节数
  int chineseCount = 0; // 中文数

  if (str.getBytes().length <= byteLength) {
   System.out.println(str);
  } else {
   for (int i = 0; i < strs.length; i++) {
    if (strs[i].getBytes().length == 1) {
     hasRead++;
     str += strs[i];
    }
    if (strs[i].getBytes().length == 2) {
     chineseCount++;
     hasRead += 2;
    }
    if (hasRead >= byteLength)
     break;
   }
   if (hasRead >= byteLength) {
    System.out.println(str.substring(0, byteLength - chineseCount));
   }
  }
}

public static void main(String args[]) {
  GetStringByBit g = new GetStringByBit();
  g.getStringbybit("ljj短时jfd福建省j", 13);
}

这个方法基本实现截取字符串的功能,但前提是你的编码必须为GBK的。



这是因为:

中文汉字在JAVA中转成字节时与字符编号有密切关系,不同的编码转换的字节length是不一样的。

getBytes("GB2312")->length:2

getBytes("UTF-8") ->length:3

getBytes("Unicode")->length:4

getBytes()->length:3,这个取决于你的IDE的编码。
回复 使用道具 举报 1 0
谢谢,能不能给个详细的注释 , 看不明白。
回复 使用道具 举报
  1. package com.itheima;
  2. import java.io.UnsupportedEncodingException;
  3. import java.util.Scanner;
  4. public class Test10 {
  5.        
  6.         public static void main(String[] args) {
  7.                 System.out.println("请输入截取的字节数:");
  8.                 Integer byteNum = new Scanner(System.in).nextInt();
  9.                 //调用函数现实截取
  10.                 String subString = subStringBybyte("HM程序员你好",byteNum);
  11.                 //输出所得结果
  12.                 System.out.println(subString);
  13.         }
  14.         /**
  15.          *
  16.          * @param data
  17.          * @param byteNum
  18.          * @return
  19.          */
  20.         private static String subStringBybyte(String data, Integer byteNum) {
  21.                 String subString = null;
  22.                 try{
  23.                         if(data!=null&&!"".equals(data)){
  24.                                 //如果字符串不为NULL或者是空字符串,将转为GBK编码的字符串
  25.                                 data = new String(data.getBytes(), "GBK");   
  26.                                 if (byteNum>=1 && byteNum<data.getBytes("GBK").length) {  
  27.                                         StringBuffer buffer = new StringBuffer();
  28.                                         char ch;
  29.                                         for (int i=0; i<byteNum; i++)
  30.                                         {
  31.                                                 ch=data.charAt(i);
  32.                                                 buffer.append(ch);
  33.                                                 // 判断是否为中文字符,如果是中文字符,将截取字节总数减1
  34.                                                 if (Test10.isChineseChar(ch)) {
  35.                                                         --byteNum;
  36.                                                 }
  37.                                         }
  38.                                         subString = buffer.toString();
  39.                                 }
  40.                         }
  41.                 }catch (Exception e) {
  42.                         e.printStackTrace();
  43.                 }
  44.                 return subString;
  45.         }

  46.         /**
  47.          * 采用GBK编码方式时,一个中文字符占2个字节
  48.          * 判断字符串某个字符是否是中文字符
  49.          * @param c
  50.          * @return
  51.          * @throws UnsupportedEncodingException
  52.          */
  53.         public static boolean isChineseChar(char c)
  54.                         throws UnsupportedEncodingException {
  55.                 byte[] b = String.valueOf(c).getBytes("GBK");
  56.                 if(b.length==2){
  57.                         return true;
  58.                 }else{
  59.                         return false;
  60.                 }
  61.         }
  62. }
复制代码


回复 使用道具 举报
  1. public static String substring(String str, int length) {

  2.                 byte[] bytes = null;
  3.                 String s = null; // 需要输出的字符串
  4.                 try {
  5.                         // 将字符串转换为字节
  6.                         bytes = str.getBytes("GBK");
  7.                 } catch (UnsupportedEncodingException e) {
  8.                         e.printStackTrace();
  9.                 }
  10.                 // 判断字节长度,如果需要截取的长度大于字节长度,则不执行
  11.                 if (bytes.length < length) {
  12.                         System.out.println("截取的字节数不能大于字符串字节数!");
  13.                 } else {
  14.                         s = new String(bytes, 0, length);
  15.                         int len = s.length();
  16.                         //判断是否出现了截半,如果出现截半,将字节指针左移一位
  17.                         if (str.charAt(len-1)!= s.charAt(len-1)) {
  18.                                 s =  new String(bytes,0,length-1);
  19.                         }
  20.                 }
  21.                 return s;
  22.         }

  23.         public static void main(String[] args) throws Exception {
  24.                 String s = "HM程序员";
  25.                 System.out.println(substring(s,5));
  26.         }
复制代码


回复 使用道具 举报
屋檐下的期待 发表于 2014-5-28 09:36
public void getStringbybit(String str, int byteLength) {
  String strs[] = str.split("");
  int hasR ...

从代码就可以看出有很多水平了啊,交个朋友吧嘿嘿
回复 使用道具 举报
学习学习,都是大牛啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马