`

字符串截取(中文长度为2)

阅读更多
StringTrimUtils,使用charArray,Java内部使用unicode,不用在意编码
java 代码
 
  1. /** 
  2.  * @author sunrie
  3.  *  
  4.  */  
  5. public class StringTrimUtils {  
  6.   
  7.     /** 
  8.      * 截取一段字符的长度(汉、日、韩文字符长度为2),不区分中英文,如果数字不正好,则少取一个字符位 
  9.      *  
  10.      * @param str 原始字符串 
  11.      * @param specialCharsLength 截取长度(汉、日、韩文字符长度为2) 
  12.      * @return 
  13.      */  
  14.     public static String trim(String str, int specialCharsLength) {  
  15.         if (str == null || "".equals(str) || specialCharsLength < 1) {  
  16.             return "";  
  17.         }  
  18.         char[] chars = str.toCharArray();  
  19.         int charsLength = getCharsLength(chars, specialCharsLength);  
  20.         return new String(chars, 0, charsLength);  
  21.     }  
  22.   
  23.     /** 
  24.      * 获取一段字符的长度,输入长度中汉、日、韩文字符长度为2,输出长度中所有字符均长度为1 
  25.      * @param chars 一段字符 
  26.      * @param specialCharsLength 输入长度,汉、日、韩文字符长度为2 
  27.      * @return 输出长度,所有字符均长度为1 
  28.      */  
  29.     private static int getCharsLength(char[] chars, int specialCharsLength) {  
  30.         int count = 0;  
  31.         int normalCharsLength = 0;  
  32.         for (int i = 0; i < chars.length; i++) {  
  33.             int specialCharLength = getSpecialCharLength(chars[i]);  
  34.             if (count <= specialCharsLength - specialCharLength) {  
  35.                 count += specialCharLength;  
  36.                 normalCharsLength++;  
  37.             } else {  
  38.                 break;  
  39.             }  
  40.         }  
  41.         return normalCharsLength;  
  42.     }  
  43.   
  44.     /** 
  45.      * 获取字符长度:汉、日、韩文字符长度为2,ASCII码等字符长度为1 
  46.      * @param c 字符 
  47.      * @return 字符长度 
  48.      */  
  49.     private static int getSpecialCharLength(char c) {  
  50.         if (isLetter(c)) {  
  51.             return 1;  
  52.         } else {  
  53.             return 2;  
  54.         }  
  55.     }  
  56.   
  57.     /** 
  58.      * 判断一个字符是Ascill字符还是其它字符(如汉,日,韩文字符) 
  59.      *  
  60.      * @param char c, 需要判断的字符 
  61.      * @return boolean, 返回true,Ascill字符 
  62.      */  
  63.     private static boolean isLetter(char c) {  
  64.         int k = 0x80;  
  65.         return c / k == 0 ? true : false;  
  66.     }  
  67. }  

SubString,网上找到的代码,加上了GBK处理,在UTF8等编码状态下也无问题
java 代码
 
  1. import java.io.UnsupportedEncodingException;  
  2.   
  3. public class SubString {  
  4.   
  5.     /** 
  6.      * 判断一个字符是Ascill字符还是其它字符(如汉,日,韩文字符) 
  7.      *  
  8.      * @param c 需要判断的字符 
  9.      * @return 返回true,Ascill字符 
  10.      */  
  11.     public static boolean isLetter(char c) {  
  12.         int k = 0x80;  
  13.         return c / k == 0 ? true : false;  
  14.     }  
  15.   
  16.     /** 
  17.      * 得到一个字符串的长度,显示的长度,一个汉字或日韩文长度为2,英文字符长度为1 
  18.      *  
  19.      * @param s 需要得到长度的字符串 
  20.      * @return i得到的字符串长度 
  21.      */  
  22.     public static int length(String s) {  
  23.         if (s == null)  
  24.             return 0;  
  25.         char[] c = s.toCharArray();  
  26.         int len = 0;  
  27.         for (int i = 0; i < c.length; i++) {  
  28.             len++;  
  29.             if (!isLetter(c[i])) {  
  30.                 len++;  
  31.             }  
  32.         }  
  33.         return len;  
  34.     }  
  35.   
  36.     /** 
  37.      * 截取一段字符的长度,不区分中英文,如果数字不正好,则少取一个字符位 
  38.      *  
  39.      *  
  40.      * @param  origin 原始字符串 
  41.      * @param len 截取长度(一个汉字长度按2算的) 
  42.      * @param c 后缀            
  43.      * @return 返回的字符串 
  44.      */  
  45.     public static String substring(String origin, int len,String c) {  
  46.         if (origin == null || origin.equals("") || len < 1)  
  47.             return "";  
  48.         byte[] strByte = new byte[len];  
  49.         if (len > length(origin)) {  
  50.             return origin+c;  
  51.         }  
  52.         try {  
  53.             System.arraycopy(origin.getBytes("GBK"), 0, strByte, 0, len);  
  54.             int count = 0;  
  55.             for (int i = 0; i < len; i++) {  
  56.                 int value = (int) strByte[i];  
  57.                 if (value < 0) {  
  58.                     count++;  
  59.                 }  
  60.             }  
  61.             if (count % 2 != 0) {  
  62.                 len = (len == 1) ? ++len : --len;  
  63.             }  
  64.             return new String(strByte, 0, len, "GBK")+c;  
  65.         } catch (UnsupportedEncodingException e) {  
  66.             throw new RuntimeException(e);  
  67.         }  
  68.     }  
  69.   
  70. }  
分享到:
评论
2 楼 raiha 2011-11-23  
感谢分享```````
1 楼 天门冬 2008-07-31  
  

相关推荐

    截取指定长度的字符串

    "截取指定长度的字符串"这个主题涉及到的是如何从一个字符串中提取出特定长度的部分。这在处理用户输入、数据展示、信息提取等多个场景中都非常常见。接下来,我们将深入探讨这个知识点。 首先,让我们明确什么是...

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

    ### C#字符串截取固定长度的方法 在C#编程语言中,经常需要处理字符串操作,其中一个常见的需求就是根据特定的长度来截取字符串。本文将详细介绍如何使用C#实现字符串的固定长度截取,并深入探讨背后的原理和技术...

    C#字符串截取

    以上三种方法分别适用于不同的字符串截取场景,其中 `GetFirstString` 方法考虑了中文字符的特殊性,而 `StringbSubString` 和 `CutString` 方法则更侧重于英文和数字字符的处理。在实际开发过程中,可以根据具体的...

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

    在Delphi编程环境中,处理中文和英文混合的字符串截取是一项常见的任务,特别是在涉及到文本处理、数据解析或者用户界面展示时。由于Unicode编码的存在,中文字符通常占据两个字节,而英文字符则占据一个字节,这就...

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

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

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

    这个示例首先将UTF-8字符串转换为宽字符串,然后遍历每个字符,如果遇到非字母字符(可能是汉字),则计算其字节长度,并相应调整截取位置。最后,将截取后的宽字符串再转换回UTF-8。 在实际项目中,可能还需要考虑...

    php字符串截取.pdf

    #### 二、GB2312中文字符串截取 **1.1 GB2312字符串截取函数** ```php function mysubstr($str, $start, $len) { $tmpstr = ""; $strlen = $start + $len; for ($i = 0; $i $strlen; $i++) { if (ord(substr($...

    java中截取带汉字的字符串

    ### Java中截取带汉字的字符串 在Java编程语言中,处理包含中文字符的字符串时,经常遇到的一个问题是如何正确地截取...通过以上方法,我们可以在Java中有效地处理包含中文字符的字符串截取问题,避免出现乱码等情况。

    java编写一个截取字符串的函数,输入为一个字符串和字节数.docx

    在 Java 中,字符串截取是一种常见的操作,特别是在处理汉字和 Unicode 字符时。下面是关于 Java 字符串截取函数的知识点: 字符串截取函数 Java 中有多种方式可以实现字符串截取,包括使用 `substring`、`split` ...

    字符串 截取

    根据给定文件的信息,本文将围绕“字符串截取”这一主题进行深入探讨,重点在于如何在Java环境下实现对包含中文字符的字符串进行精确截取,同时确保不会出现半个汉字的情况。 ### 字符串截取的基本概念 在计算机...

    JavaScript截取中文字符串

    本文将详细介绍一个专门用于处理中文字符串截取的JavaScript函数,该函数能够根据字符的实际编码长度来精确控制截取的长度。 #### 二、关键概念解析 ##### 2.1 字符串截取 字符串截取是指从一个较长的字符串中...

    按字节长度截取字符串(支持截取带HTML代码样式的字符串)

    首先,理解为什么需要按照字节长度而不是字符长度截取字符串。在处理非ASCII字符(如中文、日文等)时,一个字符可能占用多个字节。如果单纯按字符长度截取,可能会导致截取到半字符,从而破坏字符串的读取。因此,...

    ASP截取固定长度字符串

    为了更好地解决中文字符串截取问题,可以自定义一个函数`StrByteLeft()`来实现更精确的截取。 1. **函数定义**: ```vb Function StrByteLeft(str, num) Dim tmpStr, flag flag = 0 tmpStr = "" If (Len("") ...

    asp.net截取字符串方法

    在ASP.NET开发中,有时我们需要对字符串进行截取操作,特别是当涉及到多字节字符(如中文)时,简单的字符串截取可能会导致乱码问题。本文将详细介绍一种使用字节精确计算的ASP.NET字符串截取方法,并通过具体的代码...

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

    在处理这类问题时,普通的字符串截取函数,如`Left()`,无法很好地处理中文字符,因为中文字符在计算长度时通常被视为两个英文字符的宽度。本文将详细介绍如何在ASP中正确地截取中英文混合的字符串,并提供三个相关...

    Golang中文字符串截取函数实现原理

    在上述内容中,提到了使用[]rune来处理中文字符串截取问题。具体操作步骤包括:首先将原始字符串转换为[]rune类型,此时字符串中的每一个中文字符都对应着一个或多个rune值;然后基于rune值进行截取,这样无论截取的...

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

    通过上述分析可以看出,`getStr` 方法提供了一种有效的解决中文字符串截取问题的方法。它利用了正则表达式的强大功能来识别并替换中文字符,进而实现了正确的长度计算。不过需要注意的是,这种方法在实际应用中可能...

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

    给定代码片段展示了一种自定义的字符串截取方法`getSubString()`,它考虑了中文字符的特殊性。该方法接受四个参数:原字符串`str`、起始位置`start`、截取长度`length`和额外的字符串`more`。其中,`more`参数用于当...

    impala中substr()截取中文字符串乱码的问题

    1. **编写Java代码**:首先,我们需要编写一个Java类,继承`ImpalaUdf`接口,实现自定义的字符串截取逻辑。这个类应该包含一个方法,接收字符串、起始位置和长度作为参数,返回截取后的字符串。在处理中文字符时,...

    java中英文字符串截取

    3. **自定义截取逻辑**:由于标准的字符串截取方法(如`substring()`)不考虑字符的实际字节数,所以在处理包含中文的字符串时,可能需要实现自定义的截取逻辑,确保截取后的字符串不会出现乱码。 ### 示例代码解析...

Global site tag (gtag.js) - Google Analytics