论坛首页 入门技术论坛

编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串

浏览 6675 次
该帖已经被评为新手帖
作者 正文
   发表时间:2011-07-14  

编程题
编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
在网上看了很多关于此问题的解答,都感觉挺复杂的,于是自己写了一个,供大家参考,程序存在不足之处,敬请批主指正。

import java.io.UnsupportedEncodingException;

public class TestC {

 /**
  * @author zhyd
  * @param input
  *            输入字符串
  * @param subLength
  *            想要截取的字节数
  * @throws UnsupportedEncodingException
  */
 public String subStrByBytes(String input, int subLength)
   throws UnsupportedEncodingException {
  // 总的字符数,A是一个字符,汉 也只是一个字符
  int totalCharacter = input.length();
  // 总的字节数
  int totalBytes = input.getBytes("GBK").length;
  System.out.println("total bytes:" + input.getBytes("GBK").length
    + ",total character: " + totalCharacter);
  if (subLength > totalBytes) {
   System.err.println("input length error!please check.");
   return "";
  }
  int current = 0;
  String result = "";
  // 遍历字符串,直到截取目标长度
  for (int i = 0; i < totalCharacter; i++) {
   String tmp = input.substring(i, i + 1);
   int c_len = tmp.getBytes("GBK").length;
   if (current < subLength) {
    current += c_len;
    result += tmp;
   }
  }
  System.out.println("result==" + result);

  return result;

 }

 public static void main(String[] args) throws UnsupportedEncodingException {
  String str = "我ABC,中<汉DEF";
  int len = 7;
  TestC demo = new TestC();
  String out = demo.subStrByBytes(str, len);
  System.out.println(str + "   >>get " + len + " bytes is :     " + out);
 }
}

  • 大小: 9.9 KB
   发表时间:2011-07-14  
这个直接用getChars啊...
0 请登录后投票
   发表时间:2011-07-26  
如果这个字符串里不幸掺杂了阿拉伯文和韩咕噜文的话LZ就杯具了。。
0 请登录后投票
   发表时间:2011-07-26   最后修改:2011-07-26
    /**
     * 按字节数获取子字符串
     * @param str 原字符串
     * @param byteBeginIndex 开始位置
     * @param byteEndIndex 结束位置
     * @param halfCh 是否包括取到一半的汉字
     * @return 子字符串
     */
    public static String subStringByByte(String str, int byteBeginIndex, int byteEndIndex, boolean halfCh)
    {
        String result = "";
        int charLength = 0;
        int tempCharBeginIndex = 0;
        int tempCharEndIndex = 0;
        int charBeginIndex = -1;
        int charEndIndex = -1;

        if(byteEndIndex > byteBeginIndex && byteBeginIndex >= 0)
        {
            for(int i = 0; i < str.length(); i++)
            {
                charLength = str.substring(i, i + 1).getBytes().length;
                tempCharBeginIndex = tempCharEndIndex;
                tempCharEndIndex += charLength;

                if(byteBeginIndex >= tempCharBeginIndex && byteBeginIndex < tempCharEndIndex)
                {
                    charBeginIndex = (byteBeginIndex > tempCharBeginIndex && !halfCh)? i + 1: i;
                }

                if(byteEndIndex >= tempCharBeginIndex && byteEndIndex < tempCharEndIndex)
                {
                    charEndIndex = (byteEndIndex > tempCharBeginIndex && halfCh)? i + 1: i;
                    break;
                }
            }

            charEndIndex = charEndIndex == -1? (charBeginIndex == -1? 0: str.length()): charEndIndex;
            charBeginIndex = charBeginIndex == -1? 0: charBeginIndex;
            
            if(charEndIndex > charBeginIndex)
            {
                result = str.substring(charBeginIndex, charEndIndex);
            }
        }

        return result;
    }
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics