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

但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入"我ABC汉DEF",6,

应该输出为"我ABC"而不是"我ABC+汉的半个"。

import java.io.UnsupportedEncodingException;

/**
 * 截取的要点:
 * 1.首先将字符串转换成字节数组,再将字节数组的每个元素拿出来,判断有无负数(一个汉字为两个负数),即有汉字
 * 2.len:这个len是将字符串转换成字节数组的要截取的长度,
 *   如"我ABC你"的字节数组长度为7(-50,-46,65,66,67,-60,-29),而截取的是6(-50,-46,65,66,67,-60),
 * 3.对截取的字节数组(-50,-46,65,66,67,-60)统计负数的个数
 * 4.String里的方法substring方法将双字节的汉字当成一个字节的字符(UCS2字符)处理了,而我们的字节数组一个函数
 *   就是两个字节,所以要想用substring方法,还需要将负数的个数count除以二才可以
 * @author Administrator
 *
 */
public class TestJq {
 public static String subString(String str, int len) {
  if (str == null && "".equals(str)) {
   return null;
  }
  // 将字符串中的char数组转换成指定编码方式的byte数组的函数
  byte[] strBytes = null;
  try {
   strBytes = str.getBytes("GBK");
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
  }
  // 得到字符串的长度,判断截取字符串的长度是否在判断的范围内,否则返回原串
  int strLen = strBytes.length;
  if (len >= strLen || len < 1) {
   return str;
  }
   System.out.println("strBytes.length="+strBytes.length);
   System.out.println("len="+len);
  int count = 0;
  for (int i = 0; i < len; i++) {
   // 将每个字节数组转换为整型数,以为后面根据值的正负来判断是否为汉字
   int value = strBytes[i];
   System.out.print(value+",");  //我ABC你  -50,-46,65,66,67,-60,-29
   //对于第一种情况:
   //注,一个函数转换成整型数就为两个负整数,上面的”我ABC你“,
   //转换成整型数就为 -50,-46,65,66,67,-60,-29,但是len=6,所以截取下来的就是-50,-46,65,66,67,-60,count就为3
   // 如果是汉字(负),则统计截取字符串中的汉字所占字节数
   if (value < 0) {
    count++;
   }
   System.out.println("zh count="+count);
  }
  // 依据判断给定的字符串是否含有汉字,利用String类的substring()方法来截取不同的长度

// 根据所统计的字节数,判断截取到字符是否为半个汉字,奇数为半个汉字
  if (count % 2 != 0) {
   // 如果在截取长度为1时,则将该汉字取出,
   // 其他情况则不截取这里的截取长度则按字符长度截取(截取字节长度数-截取汉字字节数/2-截取到的半个汉字的字节数)
   len = (len == 1) ? len : len - count / 2 - 1; //len=6-3/2-1=4  我ABC
   // System.out.println("处理后的len="+len);

} else {
   // 截取字符长度为字节长度-汉字所占字节长度/2(汉字占两个字节)
   len = len - (count / 2);
  }
  return str.substring(0, len);

}

public static void main(String[] args) {
  
//  String inStrTest = "我ABC你EFG";
//  String strTest = inStrTest.substring(0, 2);
//  System.out.println(strTest);
  
  System.out.println("--------- 情况一-----------");
  // 情况一:
  String inStr = "我ABC你";
  String str = subString(inStr, 6);
  System.out.println(str); // 我ABC
  
  System.out.println("---------- 情况二----------");
  // 情况二:首字符为汉字
  inStr = "我ABC汉DEF";
  str = subString(inStr, 1);
  System.out.println(str); // 我
  
  System.out.println("-----------情况三---------");

// 情况三:中间有连续汉字
  inStr = "我AB爱孩子CDEF";
  str = subString(inStr, 9);
  System.out.println(str); // 我AB爱孩

System.out.println("-----------情况四---------");
  // 情况四:没有汉字
  inStr = "ABCDEF";
  str = subString(inStr, 4);
  System.out.println(str); // ABCD
 }

}

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编码的这个规则来计算实际的字节数,

编写一个截取字符串的函数相关推荐

  1. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个...

    2019独角兽企业重金招聘Python工程师标准>>> 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如"我ABC ...

  2. 编写一个截取字符串的函数,输入为一个字符串和字节数, 输出为按字节截取的字符串。 但是要保证汉字不被截半个。

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

  3. c语言提取字符串里面的数字,一个截取字符串中数字的函数

    一个截取字符串中数字的函数 我编写了一个代码,是截取字符串中数字的函数,如输入字符串:ah123hs453sh3k后,应将字符串中的字符"123"变为整数123,"453 ...

  4. 编写一个用于字符串比较的函数

    编写一个用于字符串比较的函数mystrcmp. 程序的运行结果如下所示: 输入: word work 输出: word<work 这是一个神奇的题--题目显示不完全-- 然后--按位比较ASCI ...

  5. SQL中实现截取字符串的函数

    SQL中实现截取字符串的函数 如果想实现从数据库中取数据时截取一个字段下的内容或者截取一串字符串,则能够实现这种效果的函数有Left,Right,SubString三个函数. 1.Left函数:Lef ...

  6. java 中文怎么截取_Java截取字符串的函数且保证中文截取正常

    SUBSTRING  返回字符.binary.text      或      image      表达式的一部分.有关可与该函数一起使用的有效      Microsoft®      SQL   ...

  7. mysql下SQL注入截取字符串常用函数mid(),substr(),left()

    在sql注入中,往往会用到截取字符串的问题,例如不回显的情况下进行的注入,也成为盲注,这种情况下往往需要一个一个字符的去猜解,过程中需要用到截取字符串 mid函数 此函数为截取字符串一部分.MID(c ...

  8. matlab编写正整数阶乘函数,用matlab语言编写程序:编写一个计算阶乘的函数,再编写一个脚本文件,通过键盘输入计算阶乘的n值....

    点击查看用matlab语言编写程序:编写一个计算阶乘的函数,再编写一个脚本文件,通过键盘输入计算阶乘的n值.具体信息 答:编写一个matlab文件,求1到n的阶乘之和.其代码编写的目的,就是学会自定义 ...

  9. JS_Java_Oracle_MySQL截取字符串的函数

    JS 截取字符串 函数 substring(indexStart, indexEnd): function f1() {var s = 'abcd';// 字符串的字符下标从0开始,从下标为2的字符c ...

最新文章

  1. 22岁专访库克、B站3天涨粉百万,他将毕设树莓派扫描仪升级,繁星散落在校空!...
  2. iOS和android运存机制,为什么苹果4GB运存却比安卓8GB更丝滑流畅?看完立马涨知识了...
  3. 带你入门 CSS Grid 布局
  4. android监听通知消息 脚本,Bash玩转脚本4之搞一套完整的Android反编译与分包工具...
  5. AJAX:校验用户名是否被注册
  6. 《Web Load Testing For Dummie》读书笔记
  7. java应用程序打包成可jar执行程序
  8. etl 不能转换成date_java怎么将date类型转换成datetime类型
  9. php商品详情显示页面代码,ecshop源码程序在购物车页面显示出商品的描述
  10. 不得不看的黑客工具集
  11. Android给图片加文字和图片水印
  12. NX/UG二次开发—其他—NX中C++调用C#工具并传参
  13. 《CSS实战案例汇总》涟漪
  14. Redis 集群规范(中文稿)(MOVED错误码及ASK错误码
  15. Win10 启动模拟器
  16. 项目(二)Lenovo商城
  17. 2018年上半年系统分析师上午试题答案
  18. 2015第16本:协同学--大自然构成的奥秘
  19. 几款常用光学字符识别(OCR)软件比较
  20. nohup php,使用php执行多个shell命令nohup

热门文章

  1. 没有IT工作经验找工作难吗?
  2. jQuery-获取/设置 属性(标准属性,自定义属性)和内容
  3. arxiv数据_使用neo4j第1部分分析arxiv数据
  4. 树莓派制作家用服务器,树莓派搭建家用小型NAS服务器
  5. windows程序设计(3):窗口
  6. ORA-01031:insufficient privileges 解决方法
  7. iOS自动化部署方案Jenkins Fastlane code.aliyun 蒲公英 appStore
  8. win11无法安装msi程序的解决方法
  9. FinalShell密码找回/FinalShell密码破解
  10. javaee之spring3