`
seara
  • 浏览: 624293 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

用Java实现按字节长度截取字符串的方法

阅读更多
本文为原创,如需转载,请注明作者和出处,谢谢!

Web应用程序在浏览器中显示字符串时,由于显示长度的限制,常常需要将字符串截取后再进行显示。但目前很多流行的语言,如C#、Java内部采用的都是 Unicode 16(UCS2)编码,在这种编码中所有的字符都是两个字符,因此,如果要截取的字符串是中、英文、数字混合的,就会产生问题,如下面的字符串:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->Strings="a加b等于c,如果a等1、b等于2,那么c等3";

上面的字符串既有汉字,又有英文字符和数字。如果要截取前6个字节的字符,应该是”a加b等",但如果用substring方法截取前6个字符就成了"a 加b等于c"。产生这个问题的原因是将substring方法将双字节的汉字当成一个字节的字符(UCS2字符)处理了。 要解决这个问题的方法是首先得到该字符串的UCS2编码的字节数组,如下面的代码如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->byte[]bytes=s.getBytes("Unicode");

由于上面生成的字节数组中前两个字节是标志位,bytes[0] = -2,bytes[1] = -1,因此,要从第三个字节开始扫描,对于一个英文或数字字符,UCS2编码的第二个字节是相应的ASCII,第一个字节是0,如a的UCS2编码是0 97,而汉字两个字节都不为0,因此,可以利于UCS2编码的这个规则来计算实际的字节数,该方法的实现代码如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicstaticStringbSubstring(Strings,intlength)throwsException
{

byte[]bytes=s.getBytes("Unicode");
intn=0;//表示当前的字节数
inti=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;
}

returnnewString(bytes,0,i,"Unicode");
}

下面代码使用了bSubstring方法:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->Strings="a加b等于c,如果a等1、b等于2,那么c等3";
System.out.println(bSubstring(s,
6));

上面的代码截取的字符串是"a加b等"


国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

分享到:
评论

相关推荐

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

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

    字符串 截取

    指定截取字节数,截取字符串,但是不能出现半个汉字的情况,例如: 字符串"喊sd中d王",长度2byte为:喊,长度3byte为:喊s,长度4byte为:喊sd,长度5byte为:喊sd,长度6byte为:喊sd中

    java字节与字符

    IO流 输出、输入字节流,并且任意截取字符串的长度,

    标题过长使用javascript按字节截取字符串

    做为一个前端开发人员在网页展示中经常会碰到,标题过长,需要截取字符串,用CSS的实现的话各种兼容问题,各种坑。 让后台程序截一下,又各种推托,让后台按字节截一下更是和要了后台老命一样,最后可能只会安字符...

    Java算法之对字符串的各种处理(二)

    核心思路:输入一个字符串和字节数,输出按字节数截取字符串, 其中要保证汉字不能被截半个字节,设计思路就是判断汉字占几个字节,通过string.valueof.getBytes()方法获取字符的字节数,之后遍历判断不要超过指定的...

    java字符串操作大全

    java字符串操作大全,适合初学者,浅显易懂 部JAVA字符串操作 2008-07-11 15:39:42| 分类: JAVA | 标签: |字号大中小 订阅 . JAVA字符串的方法 String a = "53c015"; //Integer.parseInt(s, radix) radix设置为...

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

    jsp截取中文字符串 len为字节长度

    java面试宝典

    215、写一个方法,实现字符串的反转,如:输入abc,输出cba 53 216、数据类型之间的转换 53 217、如何取得年月日,小时分秒 53 218、如何取得从1970年到现在的毫秒数 53 219、如何格式化日期 53 220、文件和目录(I/...

    java范例开发大全源代码

     实例90 如何使用substring()方法截取子串 118  实例91 分解字符串 119  实例92 字母大小写转换 120  实例93 去除多余的空白 120  实例94 原始数组类型的String形式 121  实例95 Java合法标识符 122...

    Java范例开发大全 (源程序)

     实例90 如何使用substring()方法截取子串 118  实例91 分解字符串 119  实例92 字母大小写转换 120  实例93 去除多余的空白 120  实例94 原始数组类型的String形式 121  实例95 Java合法标识符 122  ...

    java范例开发大全

    实例90 如何使用substring()方法截取子串 118 实例91 分解字符串 119 实例92 字母大小写转换 120 实例93 去除多余的空白 120 实例94 原始数组类型的String形式 121 实例95 Java合法标识符 122 实例96 显示一周各星期...

    java范例开发大全(pdf&源码)

    实例90 如何使用substring()方法截取子串 118 实例91 分解字符串 119 实例92 字母大小写转换 120 实例93 去除多余的空白 120 实例94 原始数组类型的String形式 121 实例95 Java合法标识符 122 实例96 显示一周各星期...

    Java范例开发大全(全书源程序)

    实例90 如何使用substring()方法截取子串 118 实例91 分解字符串 119 实例92 字母大小写转换 120 实例93 去除多余的空白 120 实例94 原始数组类型的String形式 121 实例95 Java合法标识符 122 实例96 显示一...

    千方百计笔试题大全

    215、写一个方法,实现字符串的反转,如:输入abc,输出cba 53 216、数据类型之间的转换 53 217、如何取得年月日,小时分秒 53 218、如何取得从1970年到现在的毫秒数 53 219、如何格式化日期 53 220、文件和目录(I/...

    基于Java和Python的爬虫项目实战源码.zip

    链接的重要程度---关于URL字符串的函数,仅仅考察字符串本身,比如认为".com"和"home"的URL比".cc"和"map"高,定义为IL(P); 平均链接的深度---根据上面所分析的宽度优先的原则,计算全站的平均链接深度,然后认为...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    字符类型 char 1~2000字节 固定长度字符串,长度不够的用空格补充 varchar2 1~4000字节 可变长度字符串,与CHAR类型相比,使用VARCHAR2可以节省磁盘空间,但查询效率没有char类型高 数值类型 Number(m,n) m(1~38) ...

    IO输入输出留

    //用下标值访问摸个位置的字节值 创建实例 ----------------------- 1 RandomAccessFile raf= new RandomAccessFile(文件,“r”) r 只读模式 1 RandomAccessFile raf= new RandomAccessFile(文件,“rw”) r 读写...

Global site tag (gtag.js) - Google Analytics