`
llfzy
  • 浏览: 15593 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
文章分类
社区版块
存档分类
最新评论

Java按字节长度截取字符串

阅读更多

编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输 入"我ABC汉DEF",6,应该输出为"我ABC"而不是"我ABC+汉的半个"。

   public static String substring(String str, int toCount,String more)

   {

  int reInt = 0;

  String reStr = "";

   if (str == null)

  return "";

   char[] tempChar = str.toCharArray();

   for (int kk = 0; (kk < tempChar.length && toCount > reInt); kk++) {

   String s1 = str.valueOf(tempChar[kk]);

   byte[] b = s1.getBytes();

  reInt += b.length;

   reStr += tempChar[kk];

  }

   if (toCount == reInt || (toCount == reInt - 1))

  reStr += more;

   return reStr;

  }

  Web应用程序在浏览器中显示字符串时,由于 显示长度的限制,常常需要将字符串截取后再进行显示。但目前很多流行 的语言,如C#、Java内部采用的都 是 Unicode 16(UCS2)编码,在这种编码中所有的字符都是两个字符,因此,如果要截取的字符串是中、英文、数字混合的,就会产生问题,如下 面的字符串:

  String s = "a加b等于c,如果a等1、b等于2,那么c等3";

  上面的字符串既有汉 字,又有英文字符和数字。如果要截取前6个字节的字符,应该是”a加b等",但如果用substring方法截取前6个字符就成了"a 加b等于c"。产 生这个问题的原因是将substring方法将双字节的汉字当成一个字节的字符(UCS2字符)处理了。要解决这个问题的方法是首先得到该字符串的 UCS2编码的字节数组,如下面的代码如下:

  byte[] bytes = s.getBytes("Unicode");

   由于上面生成的字节数组中前两个字节是标志位,bytes[0] = -2,bytes[1] = -1,因此,要从第三个字节开始扫描,对于一个英文 或数字字符,UCS2编码的第二个字节是相应的ASCII,第一个字节是0,如a的UCS2编码是0  97,而汉字两个字节都不为0,因此,可以 利于UCS2编码的这个规则来计算实际的字节数,该方法的实现代码 如下:

   public static String bSubstring(String s, int length) throws Exception

   {

  byte[] bytes = s.getBytes("Unicode");

   int n = 0; // 表示当前的字节数

  int i = 2; // 要截取的字节数,从第3个字节开始

   for (; i < bytes.length && n < length; i++)

  {

   // 奇数位置,如3、5、7等,为UCS2编码中两个字节的第二个字节

  if (i % 2 == 1)

  {

   n++; // 在UCS2第二个字节时n加1

  }

  else

  {

   // 当UCS2编码的第一个字节不等于0时,该UCS2字符为汉字,一个汉字算两个字节

  if (bytes[i] != 0)

   {

  n++;

  }

  }

  }

  // 如果i为奇数时,处理 成偶数

  if (i % 2 == 1)

  {

  // 该UCS2字符是汉字时,去掉这个截一半的 汉字

  if (bytes[i - 1] != 0)

  i = i - 1;

  // 该UCS2 字符是字母或数字,则保留该字符

  else

  i = i + 1;

  }

   return new String(bytes, 0, i, "Unicode");

  }

  下面代码使用了 bSubstring方法:

  String s = "a加b等于c,如果a等1、b等于2,那么c等3";

   System.out.println(bSubstring(s, 6));

  上面的代码截取的字符串是"a加b等"。

分享到:
评论

相关推荐

    java编写一个截取字符串的函数,输入为一个字符串和字节数.docx

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

    字符串 截取

    指定截取字节数,截取字符串,但是不能出现半个汉字的情况,例如: 字符串"喊sd中d王",长度2byte为:喊,长度3byte为:喊s,长度4byte为:喊sd,长度5byte为:喊sd,长度6byte为:喊sd中

    java字节与字符

    IO流 输出、输入字节流,并且任意截取字符串的长度,

    Java算法之对字符串的各种处理(二)

    核心思路:输入一个字符串和字节数,输出按字节数截取字符串, 其中要保证汉字不能被截半个字节,设计思路就是判断汉字占几个字节,通过string.valueof.getBytes()方法获取字符的字节数,之后遍历判断不要超过指定的...

    标题过长使用javascript按字节截取字符串

    做为一个前端开发人员在网页展示中经常会碰到,标题过长,需要截取字符串,用CSS的实现的话各种兼容问题,各种坑。 让后台程序截一下,又各种推托,让后台按字节截一下更是和要了后台老命一样,最后可能只会安字符...

    java 截取字符串(判断汉字)

    jsp截取中文字符串 len为字节长度

    java字符串操作大全

    java字符串操作大全,适合初学者,浅显易懂 部JAVA字符串操作 2008-07-11 15:39:42| 分类: JAVA | 标签: |字号大中小 订阅 . JAVA字符串的方法 String a = "53c015"; //Integer.parseInt(s, radix) radix设置为...

    java范例开发大全源代码

     实例42 字符串索引越界异常(StringIndexOutBounds) 60  实例43 操作错误(UnsupportedOperationException) 60  4.2 运行时异常 61  实例44 找不到指定类时发生的异常(ClassNotFoundException) 62 ...

    java范例开发大全

    实例42 字符串索引越界异常(StringIndexOutBounds) 60 实例43 操作错误(UnsupportedOperationException) 60 4.2 运行时异常 61 实例44 找不到指定类时发生的异常(ClassNotFoundException) 62 实例45 请求的...

    Java范例开发大全 (源程序)

     实例42 字符串索引越界异常(StringIndexOutBounds) 60  实例43 操作错误(UnsupportedOperationException) 60  4.2 运行时异常 61  实例44 找不到指定类时发生的异常(ClassNotFoundException) 62  ...

    java面试宝典

    56、写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔。 14 59、Java 编程,打印昨天的当前时刻。 15 60、java 和javasciprt 的区别。 15 61、什么时候用assert? 16 62、error和exception有什么...

    Java范例开发大全(全书源程序)

    实例42 字符串索引越界异常(StringIndexOutBounds) 60 实例43 操作错误(UnsupportedOperationException) 60 4.2 运行时异常 61 实例44 找不到指定类时发生的异常(ClassNotFoundException) 62 实例45 请求...

    java范例开发大全(pdf&源码)

    实例42 字符串索引越界异常(StringIndexOutBounds) 60 实例43 操作错误(UnsupportedOperationException) 60 4.2 运行时异常 61 实例44 找不到指定类时发生的异常(ClassNotFoundException) 62 实例45 请求的...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    字符类型 char 1~2000字节 固定长度字符串,长度不够的用空格补充 varchar2 1~4000字节 可变长度字符串,与CHAR类型相比,使用VARCHAR2可以节省磁盘空间,但查询效率没有char类型高 数值类型 Number(m,n) m(1~38) ...

    基于Java和Python的爬虫项目实战源码.zip

    链接的重要程度---关于URL字符串的函数,仅仅考察字符串本身,比如认为".com"和"home"的URL比".cc"和"map"高,定义为IL(P); 平均链接的深度---根据上面所分析的宽度优先的原则,计算全站的平均链接深度,然后认为...

    IO输入输出留

    java.io 包 java.io.File ============================================================================================ *表示磁盘文件或目录的路径 *可以表示一个不存在的路径 创建实例 --------------------...

    千方百计笔试题大全

    56、写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔。 14 59、Java 编程,打印昨天的当前时刻。 15 60、java 和javasciprt 的区别。 15 61、什么时候用assert? 16 62、error和exception有什么...

Global site tag (gtag.js) - Google Analytics