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

在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 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 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  System.out.println(i+":"+ cutStringByByte(str, i));
}
}
}


你可能感兴趣的:(Java)