字符串按指定的字节数的截取

在Java中字符串“abc123”与字符串“ab你好”的长度是一样的。都是四个字符,但对应的字节数不同,一个汉字两个字节

定义一个方法,按照指定的字节数来截取子串

如对于“ab你好”如果取三个字节,那么子串就是“ab”与你的半个,那么辣半个就要舍弃,如果取四个字节就是”ab你“,取五个字节还是”ab你“

import java.io.IOException;
import java.io.UnsupportedEncodingException;


import org.junit.Test;


public class StringCutDemo {

@Test //观察一下字节数据的规律
public void t1() throws IOException{
String str="ab你好琲a我aa";
print(str.getBytes("gbk"));//一个汉字两个字节,第一个字节是负数,第二个不一定
print(str.getBytes("utf-8"));//一个汉字三个字节,每个字节是负数
}
private void print(byte bs[]){
for(byte b:bs){
System.out.print(b+" ");
}
System.out.println();
}

private static String cutStringByByteGbk(String str, int len){
try {
byte bs[] = str.getBytes("gbk");
//从后往前,统计字节编码为负数的个数,统计到非负数字节停止
int count=0;
for(int i=len-1; i>=0; i--){
if(bs[i]<0){
count++;
}else{
break;
}
}


if(count%2==0){//字节码值为负的字节个数为偶数,汉字刚好完整
return new String(bs,0,len,"gbk");
}else{//奇数,要舍去最后一个字节
return new String(bs,0,len-1,"gbk");
}

} catch (UnsupportedEncodingException e) {
throw new RuntimeException("字符编码异常,不支持gbk", e);
}
}
@Test //测试cutStringByByteGbk()方法
public void t2() throws IOException{
String str="ab你好琲a我aa";
for(int i=0;i<str.getBytes("gbk").length;i++){
System.out.println(i+":"+ cutStringByByteGbk(str, i) );
}
}

private static String cutStringByByteUtf8(String str, int len){
try {
byte bs[] = str.getBytes("utf-8");
//从后往前,统计字节编码为负数的个数,统计到非负数字节停止
int count=0;
for(int i=len-1; i>=0; i--){
if(bs[i]<0){
count++;
}else{
break;
}
}

return new String(bs,0,len-count%3,"utf-8"); 
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("字符编码异常,不支持utf-8", e);
}
}
@Test //测试cutStringByByteUtf8()方法
public void t3() throws IOException{
String str="ab你好琲a我aa";
for(int i=0;i<str.getBytes("utf-8").length;i++){
System.out.println(i+":"+ cutStringByByteUtf8(str, i) );
}
}



public static String cutStringByByte(String str, int len){

if(System.getProperty("file.encoding").equalsIgnoreCase("gbk")){
return cutStringByByteGbk(str, len);
}
if(System.getProperty("file.encoding").equalsIgnoreCase("utf-8")){
return cutStringByByteUtf8(str, len);
}

return "";
}

public static void main(String[] args) {
String str="ab你好琲a我aa";
for(int i=0;i<str.getBytes().length;i++){
 System.out.println(i+":"+ cutStringByByte(str, i));
}
}
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值