本帖最后由 kitboxer 于 2015-4-10 14:25 编辑
思路跟网上常见的一样,具体方法不一样。测试通过,只是我自己都晕了,按理说若是汉字在前又指定开始的字节位置,可能截到汉字的低位,比如"大青果CH3CH3" 这个字符串,先GBK编码再转换成字节数组后,前六个字节都是汉字的,假如我指定从第一个字节开始截取,截取6个字节的长度,应该会把“大”截断,可我用这测试发现不会截断…………
- public class Test10 {
- public static void main(String[] args) throws UnsupportedEncodingException {
- String charCode=Charset.defaultCharset().name();//检测默认编码
- System.out.println("字符默认编码是"+charCode);
- Scanner input=new Scanner(System.in);
-
- // System.out.println("输入中英文混合字符串:");
- // String str=input.next();
- // System.out.println("输入开始截取的字节位置以及需要截取的字节数");
- // int star=input.nextInt();
- // int len=input.nextInt();
-
- cutStringByBytes("HM程序员",0,3);
- }
- private static void cutStringByBytes(String str,int star,int len) throws UnsupportedEncodingException{
- byte[] a= str.getBytes("GBK"); //转换成GBK码字节数组
- String b=new String(a,"GBK");//将这个字节数组转成GBK编码的字符串
- if(((star+len)<=a.length)&& len>=2){//起点加截取的长度不能超过数组的长度
- byte[]testA=Arrays.copyOfRange(a, star,star+len);//从起点开始复制,直到截断处
- String goal=new String(testA,"GBK");//将获得的字串转换成GBK编码的字符
- if(b.contains(goal)){//如果汉字没有被截断,则完整必然能转换成一个原字符串的子串,使用字符串的contains()方法检测。
- System.out.println(goal);//因为没有截断汉字,可以直接输出;
- }else{
- byte[] testB=Arrays.copyOfRange(a, star,star+len-1);//假如汉字被截断了,则舍弃这个字节
- String c=new String(testB,"GBK");//将剩下的字节重新组装成GBK编码的字符
- System.out.println(c);//输出
- }
- }
-
- }
- }
复制代码
|
|