zoukankan      html  css  js  c++  java
  • java 字符串截取

    java 字符串截取(当遇到截取半个汉字的处理)方法2舍去(项目中用的)

    方法1是看的别人的,个人认为方法1简洁

    package everyDay;

    import java.io.UnsupportedEncodingException;


    /**
    * * 题目:
    编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
    GB2312、GBK、GB18030,CP936以及CNS11643都满足条件 -- 中文是占用2个字节的,英文是占用1一个字节 。
    因为中文转换为byte字节,随着编码的不同,转换的字节长度也会不通,如编码为UTF-8,一个中文字符串转换为byte占三个字节.
    *
    */
    public class LearnCSplit {
    /**
    * 方法1,比方法2简洁
    * @param text
    * 目标字符串
    * @param length
    * 截取长度
    * @param encode
    * 采用的编码方式
    * @return
    * @throws UnsupportedEncodingException
    */
    private static String substring(String str, int length1, String code) throws UnsupportedEncodingException {
    if (str==null) {
    return null;
    }
    StringBuilder sb=new StringBuilder();
    int currentLength=0;
    for (char c : str.toCharArray()) {
    currentLength+=String.valueOf(c).getBytes(code).length;
    if (currentLength<=length1) {
    sb.append(c);
    }else {
    break;
    }
    }

    return sb.toString();
    }
    public static void main(String[] args) throws UnsupportedEncodingException {
    //StringBuilder sb=null;//线程不安全,性能高
    String str="我ABC汉DEF";
    int length1=3;
    int length2=6;
    String [] codes=new String[]{"GB2312","GBK","GB18030","CP936","CNS11643","UTF-8"};
    for (String code : codes) {
    System.out.println(new StringBuilder().append("用").append(code)
    .append("编码截取字符串--【“").append(str).append("】")
    .append(length1).append("个字节的结果是【")
    .append(substring(str,length1,code)).append("】").toString());

    System.out.println(new StringBuilder().append("用").append(code)
    .append("编码截取字符串--【“").append(str).append("】")
    .append(length2).append("个字节的结果是【")
    .append(substring(str,length2,code)).append("】").toString());
    }

    ////以上是方法1的
    String value="乌鲁木齐测试测试开发资源服务有限责任公司达坂城分公司1A2b3";
    //统计字节数
    int countBytes=conutByte(value);
    //已知字段长度40个字节
    if (countBytes>40) {
    value=substr(value,0,40);
    System.out.println("输出指定字段长度的字符串:"+value);

    }






    }

    /**
    * 统计字节数
    * @param value
    * @return
    */
    private static int conutByte(String value) {
    if (value==null) {
    return 0;
    }
    byte[] bs;
    try {
    bs = value.getBytes("GB18030");
    int lenbs=bs.length;
    return lenbs;
    } catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    return 0;
    }
    /**
    * 截取字符
    * @param str
    * @param begin
    * @param zdcd
    * @return
    */
    private static String substr(String str, int begin, int zdcd) {
    if (str == null) {
    return str;
    }
    String str2;

    str=getSubString(str,zdcd);//截取指定字节长度的字符串,不能返回半个汉字20
    zdcd=conutByte(str);//再从新计算字节个数,19
    //我去恶趣味123我我去
    byte[] bs;
    try {
    bs = str.getBytes("GB18030");
    str2 = new String(bs, begin, zdcd, "GB18030");
    return str2;
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    }
    return "";

    }
    /**
    * <b>截取指定字节长度的字符串,不能返回半个汉字</b>
    * @param str
    * @param zdcd
    * @return
    */
    private static String getSubString(String str, int zdcd) {
    int count=0;
    int offset=0;
    char[] c=str.toCharArray();

    for (int i = 0; i < c.length; i++) {

    if (c[i]>256) {
    offset=2;
    count+=2;
    }else{
    offset=1;
    count++;
    }

    if (count==zdcd) {
    return str.substring(0, i+1);
    }
    if ((count==zdcd+1 && offset==2)) {
    return str.substring(0, i);
    }

    }
    return "";
    }

    }

    控制台输出结果:

    用GB2312编码截取字符串--【“我ABC汉DEF】3个字节的结果是【我A】
    用GB2312编码截取字符串--【“我ABC汉DEF】6个字节的结果是【我ABC】
    用GBK编码截取字符串--【“我ABC汉DEF】3个字节的结果是【我A】
    用GBK编码截取字符串--【“我ABC汉DEF】6个字节的结果是【我ABC】
    用GB18030编码截取字符串--【“我ABC汉DEF】3个字节的结果是【我A】
    用GB18030编码截取字符串--【“我ABC汉DEF】6个字节的结果是【我ABC】
    用CP936编码截取字符串--【“我ABC汉DEF】3个字节的结果是【我A】
    用CP936编码截取字符串--【“我ABC汉DEF】6个字节的结果是【我ABC】
    用CNS11643编码截取字符串--【“我ABC汉DEF】3个字节的结果是【我A】
    用CNS11643编码截取字符串--【“我ABC汉DEF】6个字节的结果是【我ABC】
    用UTF-8编码截取字符串--【“我ABC汉DEF】3个字节的结果是【我】
    用UTF-8编码截取字符串--【“我ABC汉DEF】6个字节的结果是【我ABC】
    输出指定字段长度的字符串:乌鲁木齐测试测试开发资源服务有限责任公司

     方法3:截取指定长度的字符串

    public class CharactersSplit {
    public static void main(String[] args) {
    String value="乌鲁a木齐 同盛人力资源服务有限责任公司达坂城分公司1A2b3";//24+6+2=32
    //value=getSubString(value,value.toCharArray().length);//乌鲁a木齐 同
    value=getSubString(value,89);
    //value=value.substring(0, 6);//乌鲁a木齐 同//这如果是89就会报下标越界
    System.out.println(value);
    }
    /**
    *Description:截取指定长度的字符串
    * 与字符串 substring 方法相比,可以规长度不够截取出现的下标越界等问题
    */
    public static String getSubString(String sOurce, int len) {
    if (sOurce.isEmpty()) {
    return "";
    }
    if (sOurce.length() <= len) {//32=32
    // sOurce.length()=value.toCharArray().length
    return sOurce;
    }
    return sOurce.substring(0, len);
    }
    }

    运行输出结果:乌鲁a木齐  同盛人力资源服务有限责任公司达坂城分公司1A2b3

  • 相关阅读:
    [leetcode]Longest Common Prefix
    [leetcode]Container With Most Water
    [leetcode]Regular Expression Matching
    [leetcode]Palindrome Number
    [leetcode]String to Integer (atoi)
    [leetcode]Reverse Integer
    [leetcode]ZigZag Conversion
    [leetcode]Longest Palindromic Substring
    [leetcode]Add Two Numbers
    poj 1228 Grandpa's Estate
  • 原文地址:https://www.cnblogs.com/zhangqf/p/6212001.html
Copyright © 2011-2022 走看看