`

用Java实现按字节长度截取中英文数字字符串的方法总结

    博客分类:
  • java
阅读更多

方法一

//jdk1.4.2.05

	/**
	 * @author cn
	 * @param s 要截取的字符串
	 * @param length 要截取字符串的长度->是字节一个汉字2个字节
	 * return 返回length长度的字符串(含汉字)
	*/
	private static String getTitleToTen(String s, int length) throws Exception
    {

        byte[] bytes = s.getBytes("Unicode");
        int n = 0;
        int i = 2;
        for (; i < bytes.length && n < length; i++){
        	if (i % 2 == 0){
                n++;
            }else{
                if (bytes[i] != 0){
                    n++;
                }
            }
        }
        /*if (i % 2 == 1){
            if (bytes[i - 1] == 0)
                i = i - 1;
            else
                i = i + 1;
        }*/
        //将截一半的汉字要保留
        if (i % 2 == 1){
        	i = i + 1;
        }
        String eside = ".................................................................";
        byte[] byteEside = eside.getBytes("Unicode");
        String title = "";
        if (bytes[i-1] == 0){
        	title = new String(bytes, 0, i, "Unicode")+new String(byteEside,0,40,"Unicode");
        }else{
        	title = new String(bytes, 0, i, "Unicode")+new String(byteEside,0,38,"Unicode");
        }
        return title;
    }

 //方法改进

/**
	 * @author cn
	 * @param s 要截取的字符串
	 * @param length 要截取字符串的长度->是字节一个汉字2个字节
	 * return 返回length长度的字符串(含汉字)
	*/
	private static String getTitleToTen(String s, int length) throws Exception
    {

        String title = "";
        s = s.trim();
        byte[] bytes = s.getBytes("Unicode");
        int n = 0;
        int i = 2;
        int chineseNum = 0;
        int englishNum = 0;
        for (; i < bytes.length && n < length; i++){
        	if (i % 2 == 0){
                n++;
            }else{
                if (bytes[i] != 0){
                    n++;
                    chineseNum++;
                }else{
                    englishNum++;
                }
            }
        }
        /*if (i % 2 == 1){
            if (bytes[i - 1] == 0)
                i = i - 1;
            else
                i = i + 1;
        }*/
        //将截一半的汉字要保留
        if (i % 2 == 1){
        	i = i + 1;
        }
	//最后一个为非汉字则英文字符加一
    	if (bytes[i-1] == 0){
    		englishNum++;
    		   
    	}else if (englishNum % 2 != 0){//如果英文字符mod 2 != 0 代表有奇数个英文字符,所以汉字个数加一
			chineseNum++;
		}
        String eside = ".................................................................";
        String str = new String(bytes,0,i,"Unicode");
        StringBuffer ssss = new StringBuffer(str);
        ssss.append(eside);
        byte[] byteTitle = ssss.toString().getBytes("Unicode");
        int lll = (length*4-4)-2*chineseNum;//length截取字符串字节数(length*2)*(length*2)[length*2]代表参数s,和length转换成bytes[] 的字节数
        title = new String(byteTitle,0,lll,"Unicode");
        return title;
    }

 

  

   //jdk1.6.0.06

	/**
	 * @author cn
	 * @param s 要截取的字符串
	 * @param length 要截取字符串的长度->是字节一个汉字2个字节
	 * return 返回length长度的字符串(含汉字)
	*/
    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;
        }*/
        //将截一半的汉字要保留
        if (i % 2 == 1){
        	i = i + 1;
        }
        return new String(bytes, 0, i, "Unicode");
    }

 

 

 

方法二

package proc;

public class Tools {
	 public Tools() {   
     }    
    /** 
      * 字符串按字节截取 
      * @param str 原字符 
      * @param len 截取长度 
      * @return String 
      * @author kinglong 
      * @since 2006.07.20 
      */   
     public static String splitString(String str, int len) {   
            return splitString(str, len, ".......");   
      }   
  
     /** 
       * 字符串按字节截取 
       * @param str 原字符 
       * @param len 截取长度 
       * @param elide 省略符 
       * @return String 
       * @author kinglong 
       * @since 2006.07.20 
       */   
      public static String splitString(String str,int len,String elide) {   
             if (str == null) {   
                    return "";   
              }   
             byte[] strByte = str.getBytes();   
             int strLen = strByte.length;   
             //int elideLen = (elide.trim().length() == 0) ? 0 : elide.getBytes().length;   
             if (len >= strLen || len < 1) {   
                    return str;   
              }   
            /* if (len - elideLen > 0) {   
                     len = len - elideLen;   
              }  */ 
             int count = 0;   
             for (int i = 0; i < len; i++) {   
                    int value = (int) strByte[i];   
                    if (value < 0) {   
                            count++;   
                     }   
              }   
             if (count % 2 != 0) {   
                     len = (len == 1) ? len + 1 : len - 1;   
              }   
             return new String(strByte, 0, len) + elide.trim();   
       }  
      /**
  	 * @param args
  	 */
  	public static void main(String[] args) {
  		// TODO Auto-generated method stub
  		Tools cs = new Tools();
  		//String s = "a加b等cc于c";
  		//String s = "a加b等cc于c";
  		String s ="aaas学位英语专区 学s位英语专区 学s位英语专区 学位英语专区"; 
  		try{
  			System.out.println(cs.splitString(s, 20));
  		}catch(Exception e){
  			e.printStackTrace();
  		}
  	}
} 


 

方法三

/**
	   * 取字符串的前toCount个字符
	   *
	   * @param str 被处理字符串
	   * @param toCount 截取长度
	   * @param more 后缀字符串
	   * @version 2004.11.24
	   * @author zhulx
	   * @return String
	   */
		public static String substring(String str, int toCount,String more)throws Exception{
			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;
			}

 

分享到:
评论

相关推荐

    delphi 实现截取字符串中中文+英文混合截取

    总结来说,处理Delphi中的中文和英文混合字符串截取,关键在于理解Unicode字符串的特性,正确选择和使用字符串截取函数,并在必要时进行字节对齐和编码转换。通过这样的方式,我们可以确保在处理多语言文本时不会...

    关于java按字节截取带有汉字的字符串的解法

    在Java编程语言中,处理带有汉字的字符串时,由于汉字占据多个字节,按照字节进行截取可能会导致汉字被不完整地分割,从而产生乱码。为了解决这个问题,我们需要理解Unicode编码以及如何在Java中正确处理多字节字符...

    C#字符串截取固定长度的方法

    还可以使用正则表达式来实现更复杂的截取逻辑,例如只截取连续的英文字符或数字等。 ```csharp public static string CutStringByRegex(string inputString, int len) { var matches = Regex.Matches(inputString,...

    Java截取中英文混合字符串的方法

    总结来说,Java截取中英文混合字符串的方法需要综合考虑编码方式和汉字占用字节长度的问题,并且需要采取适当的技术手段来确保汉字不会被截断。通过自定义截取方法,并在截取过程中正确地使用编码方式,我们可以有效...

    高效中英文字符串截取方法

    ### 高效中英文字符串截取方法 #### 知识点概述 本文将详细介绍一种用于高效截取中英文混合字符串的方法。该方法适用于处理大量数据(例如10万条记录),能够在极短的时间内(例如1秒)完成所需的操作。这种方法...

    java中英文字符串截取

    ### Java中英文字符串截取的关键点 1. **字符编码的影响**:中文字符在不同的编码方式下占用的字节数不同。例如,在UTF-8编码中,中文字符通常占用3个字节,而在GBK编码中,则可能占用2或4个字节。因此,在计算字符...

    java中截取带汉字的字符串

    ### Java中截取带汉字的字符串 在Java编程语言中,处理包含中文字符的字符串时,经常遇到的一个问题是如何正确地截取这些字符串。如果直接按照字节(byte)来进行分割,很容易导致中文字符被截断一半,从而形成乱码。...

    ASP中英文混合字符串的截取

    本文将详细介绍如何在ASP中正确地截取中英文混合的字符串,并提供三个相关的函数:`CnSubString()`, `CnLen()` 和 `CnCutString()`。 首先,`CnSubString()`函数用于截取包含中文的字符串。这个函数接受三个参数:`...

    截取如下字符串“java程序教程”的前5个字节,字符串应该为“java程”,截取前6个字符,字符串也应该为“java程”,程序实现之.

    题目中提到“截取前5个字节, 字符串应该为‘java程’”,意味着我们需要理解,在UTF-8编码格式下,英文字符通常占用1个字节,而中文字符则占用3个字节。因此,实际上,从“java程序教程”中截取前5个字节,得到的...

    中英文字符串按字节截取

    截取含有中英文的字符串,按字节进行截取,当出现汉字时不能截取半个汉字要把汉字补全。

    截取中英文字符串函数

    可以截取中英文字符串,也可以含有字符,里面有好几个方法 有按字符个数截取 有按字节数来截取不会存在乱码

    java 中字符串只中英数字混合需要分割的解决办法

    这个方法用来处理java中可能有一些特别的需要,一大串中英文混合,需要中间截断或是中英中间添加一些特别的标识,调用这个方法 第一个参数是要处理的字符串,第二个是要在中英字符中间插入的字符。调用就可以得到想...

    [待删除]字符串截取 - 中英文

    根据给定文件的信息,我们将深入探讨Java中字符串截取的原理、方法以及在中英文操作系统下的特殊处理。 ### Java字符串截取 #### 原理与实现 在Java中,字符串本质上是一个不可变的字符序列,由`char`类型的数组...

    统计字符串中英文标点数量并截取.zip

    这个压缩包内包含的可能是Java代码示例(如csdn-demo),用于批量处理字符串,统计其中的中英文标点符号的数量,并根据指定的字符编码(GBK或UTF)来计算字符串的总长度。如果字符串的总长度超过预设的最大长度,...

    java实现中英文混合字符截取方法

    这种方法主要用于解决在 Java 中截取字符串时遇到的问题,即在截取中英文混合字符串时如何避免汉字被截半个。 在 Java 中,字符串是以 Unicode 编码方式存储的,每个字符占用 2 个字节。因此,在截取字符串时需要...

    c#截取指定长度,中英文混合字符串

    ### C# 截取指定长度的中英文混合字符串方法解析 在C#中处理文本时,经常需要对字符串进行截取操作。对于包含中文字符的字符串来说,由于一个中文字符通常占据两个字节的位置(在某些编码下),因此在进行长度判断...

    C#字符串截取

    根据给定的文件信息,我们可以总结出以下关于C#中的字符串截取的相关知识点: ### C#字符串截取方法概述 在C#编程语言中,字符串处理是非常常见的需求之一,尤其是在Web开发、桌面应用开发以及数据处理等领域。...

    实现一个按字节来截取字符串的方法,功能类似于string类的substring方法,

    实现一个按字节来截取字符串的方法,功能类似于string类的substring方法,String类是按字符截取 的,例如"中国abc".substring(1,3),将返回“国a”。这里 要求按字节截取,一个英文字符当一个字节,一个中文字符当两...

    字符串截取(按字节)

    本文将深入探讨一种按字节截取字符串的方法,并通过分析一个具体的Java代码示例来解释其实现原理。 #### 核心概念:Unicode与字节 在讨论字符串按字节截取之前,我们首先需要理解几个基础概念。现代计算机系统中,...

    C++中英混合字符串截取

    题目中的问题聚焦于如何正确地截取一个中英混合的字符串,确保在截取过程中不会将汉字字符截断。这个问题涉及到字符编码、字符串处理以及对Unicode的理解。下面将详细解释相关知识点。 首先,我们要理解在C++中处理...

Global site tag (gtag.js) - Google Analytics