/*
需求:在java中,字符串“abcd”与字符串“ab你好”的长度是一样,都是四个字符。
但对应的字节数不同,一个汉字占两个字节。
定义一个方法,按照最大的字节数来取子串。
如:对于“ab你好”,如果取三个字节,那么子串就是ab与“你”字的半个,
那么半个就要舍弃。如果去四个字节就是“ab你”,取五个字节还是“ab你”.
*/

代码:其实是一个解码和编码的问题,要明白UTF-8码表和GBK码表的区别,UTF-8中用三个字节代表一个汉字,GBK使用2个字节代表一个汉字。

且在码表中都是用数字存放这些汉字。例如在GBK码表中,“你”为“-60 -29”;“好”为“-70 -61”,"谢"为"-48 -69".

我们把字符串先变成字节,按字节截取字符串。也就是先编码成某个码表中的数字,然后在把数字翻译过来,也就是查码表。对于GBK码表来说,两个数字代表一个汉字,且一般汉字用负数代表。那么我们可以来统计负数的个数count来决定是否舍弃半个汉字的问题,然后在判断负数的个数的奇偶性,如果count是奇数,则截取最后一个数字,舍弃半个汉字,解码输出,如果是偶数,全部解码输出。

public class Test {/*** @param args* @throws IOException */public static void main(String[] args) throws IOException {String str = "ab你好cd谢谢";// 97 98 -60 -29 -70 -61 99 100 -48 -69 -48 -69int len = str.getBytes("gbk").length;        for(int x=0; x<len; x++){System.out.println("截取"+(x+1)+"个字节结果是:"+cutStringByByte(str, x+1));}//        int len = str.getBytes("utf-8").length;
//        for(int x=0; x<len; x++){
//            System.out.println("截取"+(x+1)+"个字节结果是:"+cutStringByU8Byte(str, x+1));
//        }
         }/*        String str1 = "琲";//-84 105          byte[] buf = str1.getBytes("gbk");          for(byte b : buf){             System.out.print(" "+b);//-84  105 *//*** 使用Utf-8按照字节截取字符串,Utf-8用3个字节代表一个汉字。*/public static String cutStringByU8Byte(String str, int len) throws IOException {byte[] buf = str.getBytes("utf-8");//编码
        System.out.println(buf);int count = 0;for(int x=len-1; x>=0; x--){if(buf[x]<0)count++;elsebreak;}if(count%3==0)return new String(buf,0,len,"utf-8");//解码else if(count%3==1)return new String(buf,0,len-1,"utf-8");else return new String(buf,0,len-2,"utf-8");}/*** 使用字节截取字符串,gbk默认一个汉字为2个字节,编码表用两个数字代表一个汉字。* (60 -29 -70 -61)代表你好* 思路:我们可以记录负数的个数,* 如果数字的个数为偶数,不用截取,没有半个汉字的情况,* 如果负数的个数为奇数,那么加入有5个数字,那么最后一个数字舍弃。变为4个数字,再解码。* @param str* @param len* @return* @throws IOException*/public static String cutStringByByte(String str,int len) throws IOException{byte[] buf = str.getBytes("gbk");//把指定编码的字符串转化为字节,存放到字节数组中,编码int count = 0;for(int x=len-1; x>=0; x--){//从数组的最后面开始循环,记录负数的个数if(buf[x]<0)//汉字的编码表为负数count++;elsebreak;}if(count%2==0)//负数的个数为偶数,不截取return new String(buf,0,len,"gbk");//解码elsereturn new String(buf,0,len-1,"gbk");//舍弃一位数字,解码
    }
}

java基础知识回顾之---java String final类普通方法的应用之“按照字节截取字符串”...相关推荐

  1. java基础知识回顾之java Thread类学习(七)--java多线程安全问题(死锁)

    死锁:是两个或者两个以上的线程被无限的阻塞,线程之间互相等待所需资源. 线程死锁产生的条件: 当两个线程相互调用Join()方法. 当两个线程使用嵌套的同步代码块的时候,一个线程占用了另一个线程的锁, ...

  2. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

  3. 【Java基础知识回顾篇】之打怪升级Day001

    Java基础知识回顾篇之打怪升级Day001 目录 Java基础知识回顾篇之打怪升级Day001 简介 一.为什么现在主流的是Java8和Java11? 二.简单尝试编写java程序 1.编写一个He ...

  4. Java基础知识(二)(Object类的常用方法、日期时间类、System类、StringBuilder类、包装类、Collection集合、Iterator迭代器、泛型、list集Set接口...)

    文章目录 Java基础知识(二) 1.Object类的常用方法 1.1 toString方法 1.2 equals方法 1.3 Objects类 2.日期时间类 2.1 Date类 2.2 DateF ...

  5. 【Java基础知识 1】Java入门级概述,让阿里架构师告诉你为什么要分库分表

    1998年12月8日,第二代Java平台的企业版J2EE发布. 1999年4月27日,HotSpot虚拟机发布. 2005年6月,在Java One大会上,Sun公司发布了Java SE 6.此时,J ...

  6. java基础知识之初识java

    java基础知识之初识java JAVA基础课后总结 一 1.计算机程序 定义:程序(Program)是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合. 2.指令 定义:指令就是指示机 ...

  7. Java基础知识回顾之四 ----- 集合List、Map和Set

    前言 在上一篇中回顾了Java的三大特性:封装.继承和多态.本篇则来介绍下集合. 集合介绍 我们在进行Java程序开发的时候,除了最常用的基础数据类型和String对象外,也经常会用到集合相关类. 集 ...

  8. Java基础知识回顾之三 ----- 封装、继承和多态

    前言 在上一篇中回顾了java的修饰符和String类,这篇就来回顾下Java的三大特性:封装.继承.多态. 封装 什么是封装 在面向对象程式设计方法中,封装是指一种将抽象性函式接口的实现细节部份包装 ...

  9. Java基础知识回顾之六 ----- IO流

    前言 在上一篇文章中,回顾了Java的多线程.而在本篇文章中主要介绍Java IO的相关知识. IO的介绍 什么是IO? IO的名称又来是Input与Output的缩写,也就是输入流和输出流.输入流用 ...

最新文章

  1. 彭博社 : 中国稀土——美欧的苦恼
  2. 关于Unicode,字符集,字符编码
  3. linux中85379端口如何恢复,技术|如何在 Linux/Unix 系统中验证端口是否打开
  4. 枚举的使用(限foton)
  5. node+bower+gulp+webpack初见
  6. firefox使用技巧 - 公司内部站点
  7. 最近新明白的SQL小知识
  8. python--re模块
  9. CAVLC和CABAC简介
  10. 编程求一元二次方程的解
  11. 可编程的经济的来临,基于区块链的智慧商圈
  12. 【线性代数】6-1:特征值介绍(Introduction to Eigenvalues)
  13. 【Spring Web教程】SpringBoot 实现一应用多端口
  14. 数据库系统-数据库的完整性
  15. JavaScript ArrayBuffer浅析
  16. 计算机有效策略无法连接打印机,共享打印提示:Windows无法连接到打印机,拒绝访问...
  17. 接收机伪距和相位偏差时变性对PPP的影响分析
  18. 【天地图】使用天地图api绘制GeoJson数据
  19. 2000-2019 年制造业各细分行业数据库
  20. 龙志勇:云游戏的量变与质变 | WISE2022峰会演讲实录

热门文章

  1. 2012-11-6 2个月小结
  2. centos LAMP菜鸟搭建过程
  3. 北京地铁规划大全(图),买房子可以参考一下
  4. 关于服务器耗电量的计算
  5. java留言板功能齐全源码_各类Java微信开发框架源码对比(建议收藏)
  6. vue add element报错_Vue 源码解析 -- new Vue -gt; mountComponent 001
  7. Resumable.js - 基于HTML5 File API的可断点续传的文件上传插件
  8. myeclipse中对jar包中的类热部署调试方法介绍
  9. 让Spring 3中jsp的数据对象使用懒加载(FetchType.LAZY)与Controller的JSR 303并存
  10. andriod数据库的开发