黑马程序员技术交流社区
标题:
新方法解决GBK按字节截断问题
[打印本页]
作者:
kitboxer
时间:
2015-4-10 14:22
标题:
新方法解决GBK按字节截断问题
本帖最后由 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);//输出
}
}
}
}
复制代码
作者:
BertYan
时间:
2015-4-10 14:27
顶.........
作者:
kitboxer
时间:
2015-4-10 14:28
BertYan 发表于 2015-4-10 14:27
顶.........
跑一跑,看一看,这段代码还是有些小问题:'(
作者:
fantacyleo
时间:
2015-4-10 14:42
原题目是什么?
作者:
kitboxer
时间:
2015-4-10 14:46
fantacyleo 发表于 2015-4-10 14:42
原题目是什么?
有一个GBK编码的字母汉字混合的字符串,要求 输出为按字节截取的字符串。 但是要保证汉字不被截半个,
如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6, 应该输出为“我ABC”而不是“我ABC+汉的半个”
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2