向C#的String类添加按字节截取字符串的扩展方法

简介:
Web应用程序在浏览器中显示字符串时,由于显示长度的限制,常常需要将字符串截取后再进行显示。但目前很多流行的语言,如C#、Java内部采用的都是Unicode 16(UCS2)编码,在这种编码中所有的字符都是两个字符,因此,如果要截取的字符串是中、英文、数字混合的,就会产生问题,如下面的字符串:
String s  =   " a加b等于c,如果a等1、b等于2,那么c等3 " ; 
     上面的字符串既有汉字,又有英文字符和数字。如果要截取前6个字节的字符,应该是”a加b等",但如果用Substring方法截取前6个字符就成了"a加b等于c"。产生这个问题的原因是将Substring方法将双字节的汉字当成一个字节的字符(UCS2字符)处理了。 要解决这个问题的方法是首先得到该字符串的UCS2编码的字节数组,如下面的代码如下:
byte [] bytes  =  System.Text.Encoding.Unicode.GetBytes(s);
    然后从第一个字节开始扫描,对于一个英文或数字字符,UCS2编码的第一个字节是相应的ASCII,第二个字节是0,如a的UCS2编码是97  0,而汉字两个字节都不为0,因此,可以利于UCS2编码的这个规则来计算实际的字节数,为了更方便,将按字节长度截取字符串的方法注册为String类的扩展方法,实现代码如下: 
public   static   class  StringExt
{

    
public   static  String bSubstring( this   string  s,  int  length)
    {
        
byte [] bytes  =  System.Text.Encoding.Unicode.GetBytes(s);
        
int  n  =   0 ;   //   表示当前的字节数
        
int  i  =   0 ;   //   要截取的字节数
        
for  (; i  <  bytes.GetLength( 0 &&  n  <  length; i ++ )
        {
             //   偶数位置,如0、2、4等,为UCS2编码中两个字节的第一个字节
             if  (i  %   2   ==   0 )
            {
                n
++ ;        //   在UCS2第一个字节时n加1
            }
            
else
            {
               //   当UCS2编码的第二个字节大于0时,该UCS2字符为汉字,一个汉字算两个字节
                 if  (bytes[i]  >   0 )
                {
                    n
++ ;
                }
            }
        }
         //   如果i为奇数时,处理成偶数
         if  (i  %   2   ==   1 )
        { 
              //   该UCS2字符是汉字时,去掉这个截一半的汉字
             if  (bytes[i]  >   0 )
                i  =  i  -   1 ;
             //   该UCS2字符是字母或数字,则保留该字符
             else
                i 
=  i  +   1 ;
        }

         return  System.Text.Encoding.Unicode.GetString(bytes,  0 , i);
    }
}
     在上面的代码中,如果最后要截取奇数个字符(以字节为单位),并且当最后一个字符是字母或数字,则保留该字符,如果是汉字,说明这个汉字被截了一半,则去掉这个汉字。
     可以使用下面的代码来截取字符串:
String subStr  =  s.bSubstring( 6 );   //   substr的值是"a加b等" 

 本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/214973,如需转载请自行联系原作者

相关文章
|
4天前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
36 11
|
10天前
|
存储 JavaScript Java
课时44:String类对象两种实例化方式比较
本次课程的主要讨论了两种处理模式在Java程序中的应用,直接赋值和构造方法实例化。此外,还讨论了字符串池的概念,指出在Java程序的底层,DOM提供了专门的字符串池,用于存储和查找字符串。 1.直接赋值的对象化模式 2.字符串池的概念 3.构造方法实例化
|
10天前
|
Java
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、&quot;+&quot;操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。
|
11天前
|
Java 程序员
课时16:String字符串
课时16介绍了Java中的String字符串。在Java中,字符串使用`String`类表示,并用双引号定义。例如:`String str = &quot;Hello world!&quot;;`。字符串支持使用“+”进行连接操作,如`str += &quot;world&quot;;`。需要注意的是,当“+”用于字符串与其他数据类型时,其他类型会先转换为字符串再进行连接。此外,字符串中可以使用转义字符(如`\t`、`\n`)进行特殊字符的处理。掌握这些基本概念对Java编程至关重要。
|
1月前
|
SQL Java 测试技术
C#字符串拼接的6种方式及其性能分析对比
在C#编程中字符串拼接是一种常见且基础的操作,广泛应用于各种场景,如动态生成SQL查询、构建日志信息、格式化用户显示内容等。然而,不同的字符串拼接方式在性能和内存使用上可能存在显著差异。今天咱们一起来看看在C#中字符串拼接的常见6种方式及其使用BenchmarkDotNet进行性能分析对比。
|
4月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
134 2
|
4月前
|
索引 Python
String(字符串)
String(字符串)。
76 3
|
5月前
|
NoSQL Redis
Redis 字符串(String)
10月更文挑战第16天
73 4
|
5月前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
134 2
|
5月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
51 1