java 字符串截取的实例详解

java 字符串截取的实例详解

题目

在java中,字符串“abcd”与字符串“ab你好”的长度是一样,都是四个字符。

但对应的字节数不同,一个汉字占两个字节。

定义一个方法,按照指定的字节数来取子串。

如:对于“ab你好”,如果取三个字节,那么子串就是ab与“你”字的半个,那么半个就要舍弃。

如果取四个字节就是“ab你”,取五个字节还是“ab你”。

仅考虑GBK和utf-8编码

实例代码:

import java.io.UnsupportedEncodingException;

import org.junit.Test;

/**
 * @author<a href="mailto:953801304@qq.com" rel="external nofollow" >胡龙华</a>
 * @version 2017-4-4 下午1:08:45
 * @fileName StringCut.java
 */
public class StringCut {

  @Test
  public void analyze(){
    String str1 = "你好abc";
    byte[] bs1=null;
    byte[] bs2=null;
    try {
       bs1 = str1.getBytes("GBK");
       System.out.println("---GBK---");
       for(byte b:bs1){
         System.out.print(b+" ");
       }
       System.out.println();
      //-60 -29 -70 -61 97 98 99
      // 发现规律,再gbk中一个中文汉字 都是以两个字节 小于0的数存储
       bs2 = str1.getBytes("utf-8");
       System.out.println("---utf-8---");
       for(byte b:bs2){
         System.out.print(b+" ");
       }
      //-28 -67 -96 -27 -91 -67 97 98 99
      // 发现规律,在utf-8中一个中文汉字 是以三个字节 小于0 的数存储
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }
  }
  /**
   * 思路:从第len个往前数,连续2的倍数个负数则全部输出,单数个则去掉最后一个输出
   * @param str
   * @param len
   * @return
   */
  private static String StringCutByGBK(String str,int len){
    byte[] bs = null;
    try {
      int count = 0;
      bs = str .getBytes("GBK");
      for(int i=len-1;i>=0;i--){
        if(bs[i]<0){
          count++;
        }else{
          break;
        }
        // 0  1  2  3  4 5  6 7  8  9  10 11 12
      }  //-60 -29 -70 -61 -80 -95 97 98 99 -76 -17 -72 -25
      if(count%2==0){
        String s=new String(bs, 0, len, "GBK");
        System.out.println("截取"+len+"个字符:"+s);
      }else{
        String s=new String(bs, 0, len-1, "GBK");
        System.out.println("截取"+len+"个字符:"+s);
      }
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }

    return null;
  }
  /**
   * 思路:从第len个往前数,连续3的倍数个负数则全部输出,其他情况则去掉最后count%3个输出
   * @param str
   * @param len
   * @return
   */
  private static String StringCutByUTF8(String str,int len){
    byte[] bs = null;
    try {
      int count = 0;
      bs = str .getBytes("UTF-8");
      for(int i=len-1;i>=0;i--){
        if(bs[i]<0){
          count++;
        }else{
          break;
        }
      }
      // 0  1  2  3  4  5  6 7 8 9  10 11 12
      //-60 -29 -70 -61 -80 -95 97 98 99 -76 -17 -72 -25
      if(count%3==0){
        String s=new String(bs, 0, len, "UTF-8");
        System.out.println("截取"+len+"个字符:"+s);
      }else{
        String s=new String(bs, 0, len-count%3, "UTF-8");
        System.out.println("截取"+len+"个字符:"+s);
      }
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }

    return null;
  }
  @Test
  public void TEST() {
    String str = "你好啊abc达哥";
    try {
      System.out.println("---测试gbk---");
      byte bs [] = str.getBytes("GBK");
      for(int i=0;i<=bs.length;i++){
        //System.out.print(bs[i]+" ");
        StringCutByGBK(str,i);

      }

      System.out.println("---测试UTF-8---");
      byte bs2 [] = str.getBytes("utf-8");
      for(int i=0;i<=bs2.length;i++){
        //System.out.print(bs[i]+" ");
        StringCutByUTF8(str,i);

      }
    } catch (UnsupportedEncodingException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

  }

}

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • java按字节截取带有汉字的字符串的解法(推荐)

    由于接口使用的oracle字段长度为固定字节数,然后传进来的字符串估计比数据库字段的总字节数要大,那么截取小于数据库字节数的字符串. 自己参考网上的例子,整了个递归调用就可以了,因为截取的字符字节长度必须小与数据库的字节长度,即如果最后一个字符为汉字,那么只能去掉往前截取. /** * 判断传进来的字符串,是否 * 大于指定的字节,如果大于递归调用 * 直到小于指定字节数 ,一定要指定字符编码,因为各个系统字符编码都不一样,字节数也不一样 * @param s * 原始字符串 * @param

  • Java截取特定两个标记之间的字符串实例

    如有一串字符串: <abcd efg>higklmnopq<rstu vwxyz> java代码如下: public class StringTest { public static void main(String[] args) { String str = "<abcd efg>higklmnopq<rstu vwxyz"; System.out.println(str.substring(str.indexOf(">&q

  • java中简单的截取分割字符串实例

    目前整理出来三种形式: 可根据实际需要选择使用 String userNameUrl; int beginIndex = 0; int endIndex = 0; userNameUrl = "454512@hongri@4944115455d9591b274648a06303d910de"; /** * 方法一: */ beginIndex = userNameUrl.indexOf("@")+1; endIndex = userNameUrl.lastIndex

  • java 实现截取字符串并按字节分别输出实例代码

    java 实现截取字符串并按字节分别输出实例代码 前言: 请编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串.但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入"我ABC汉DEF"6,应该输出"我ABC",而不是"我ABC"+"汉"字的半个. 2.解析思想 本题容易产生困惑的是中文字符和英文字符如何处理,在这里需要考虑汉字和英文字符的占用字节

  • JAVA中截取字符串substring用法详解

    substring public String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串.该子字符串始于指定索引处的字符,一直到此字符串末尾. 例如: "unhappy".substring(2) returns "happy" "Harbison".substring(3) returns "bison" "emptiness".substring

  • Java截取字符串的方法

    本文实例讲述了Java截取字符串的方法.分享给大家供大家参考.具体实现方法如下: public static void main(String args[]) { //以该字符第一次出现,开始截取 //String str="abc.def"; //String str="abc.def.sdfsdf.fsdfd.ddddd.ggggg.ttttt"; //String str1=str.substring(str.indexOf(".")+1,

  • java 字符串截取的三种方法(推荐)

    众所周知,java提供了很多字符串截取的方式.下面就来看看大致有几种. 1.split()+正则表达式来进行截取. 将正则传入split().返回的是一个字符串数组类型.不过通过这种方式截取会有很大的性能损耗,因为分析正则非常耗时. String str = "abc,12,3yy98,0"; String[] strs=str.split(","); for(int i=0,len=strs.length;i<len;i++){ System.out.pri

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

    复制代码 代码如下: /** * 截取字符串 len为字节长度 * @param str * @param len * @return * @throws UnsupportedEncodingException */ public static String getLimitLengthString( String str,int len){ try{ int counterOfDoubleByte = 0; byte[] b = str.getBytes("gb2312"); if

  • Java使用正则表达式截取重复出现的XML字符串功能示例

    本文实例讲述了Java使用正则表达式截取重复出现的XML字符串功能.分享给大家供大家参考,具体如下: public static void main(String[] args) throws DocumentException { String s = "<MTCCommand Time=\"2014-03-22\"><Login UserId=\"admin\" UserPasswd=\"123\" />&l

  • java 字符串截取的实例详解

    java 字符串截取的实例详解 题目 在java中,字符串"abcd"与字符串"ab你好"的长度是一样,都是四个字符. 但对应的字节数不同,一个汉字占两个字节. 定义一个方法,按照指定的字节数来取子串. 如:对于"ab你好",如果取三个字节,那么子串就是ab与"你"字的半个,那么半个就要舍弃. 如果取四个字节就是"ab你",取五个字节还是"ab你". 仅考虑GBK和utf-8编码 实例代

  • java 字符串反转的实例详解

    java 字符串反转的实例详解 1.new StringBuffer("abcde").reverse().toString(); 2.通过char数组进行转换, 代码如下 package com.test.reverse; public class TestReverse { public static void main(String[] args) { // 声明任意字符串 String str = "abcde"; //将字符串转换成char[] char[

  • Java 生成随机字符串数组的实例详解

    Java 生成随机字符串数组的实例详解 利用Collections.sort()方法对泛型为String的List 进行排序.具体要求: 1.创建完List<String>之后,往其中添加十条随机字符串 2.每条字符串的长度为10以内的随机整数 3.每条字符串的每个字符都为随机生成的字符,字符可以重叠 4.每条随机字符串不可重复 将涉及到的知识有: String.StringBuffer.ListArray.泛型.Collections.sort.foreach.Random等相关知识,算是

  • Java中File的实例详解

    Java中File的实例详解 File 代表文件或者目录的类 构造函数 File(File parent,String child)---代表了指定父目录下的指定的子文件或者子目录 File(String pathname)---代表了指定路径对应的文件或者目录对象 重要方法 创建 createNewFile()---只能用来创建文件,并且一次只能创建一个文件,要求文件存储的目录必须真实存在 mkdir()---只能用来创建目录,不能用来创建多层目录 mkdirs()---创建多层目录 删除 d

  • java 进制转换实例详解

    java 进制转换实例详解 十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinaryString(int i) 十六进制转成十进制 Integer.valueOf("FFFF",16).toString() 八进制转成十进制 Integer.valueOf("876",8).toString() 二进制转十进制 Integ

  • Java身份证验证方法实例详解

    Java身份证验证方法实例详解 身份证号码验证 1.号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码, 八位数字出生日期码,三位数字顺序码和一位数字校验码. 2.地址码(前六位数) 表示编码对象常住户口所在县(市.旗.区)的行政区划代码,按GB/T2260的规定执行. 3.出生日期码(第七位至十四位) 表示编码对象出生的年.月.日,按GB/T7408的规定执行,年.月.日代码之间不用分隔符. 4.顺序码(第十五位至十七位) 表示在同

  • 浅谈JAVA中输入输出流实例详解

    java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要包装许多不同的对象.在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流....本文的目的是为大家介绍JAVA中输入输出流实例详解. 流的层次结构 定义:        java将读取数据对象成为输入流,能向其写入的对象叫输出流.结构图如下: 1.输入输出: 输入/输出(Input/Output)是指对某

  • Java 常量池的实例详解

    Java 常量池的实例详解 Java的常量池中包含了类.接口.方法.字符串等一系列常量值.常量池在编译期间就已经确定,并保存在*.class文件中 一.对于相同的常量值,常量池中只保存一份拷贝. 而且,当一个字符串由多个字符串常量链接而成时,多个字符串被组成一个字符串常量. 例如: package lxg; public class main { public static void main(String[] args) { String name = "lengxuegang";

  • java日期相关类实例详解

    一.Date类 类 Date 表示特定的瞬间,精确到毫秒.用距离1970年1月1日00:00:00的毫秒数(long)类型来表示一个特定的时间点,该值可正可负. Date类中很多方法已经过时,使用Calendar来替代. 常用方法有 long getTime() void setTime(long time) public class T01Date { public static void main(String[] args) { //getTime():返回的时间是距离1970年的毫秒数.

  • java 读取网页内容的实例详解

    java 读取网页内容的实例详解 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.*; public class loadurl { public static void main(String args[]) { String a = null; try { String url = "(这里替换成任意网页的网址)"

随机推荐