黑马程序员技术交流社区
标题:
从字符串中按字节数截取一部分,但不能截取出半个中文
[打印本页]
作者:
songwei
时间:
2015-8-31 14:07
标题:
从字符串中按字节数截取一部分,但不能截取出半个中文
在做基础测试题的时候,遇到了一个比较麻烦的题目:编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
* 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文。
上网搜了类似题目的解决方法后,我编写的代码如下:
*
* 编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
* 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
*
*
*
*/
public class Test10 {
public static void main(String[] args) throws Exception{
String str = "HM程序员";
getSubString(str, 2);//截取2个字节
getSubString(str, 3);//截取3个字节
getSubString(str, 4);//截取4个字节
}
//从字符串中按字节数截取一部分,但不会截取出半个中文(GBK码表)
private static void getSubString(String str, int len) throws Exception{
int charsNumber = len;//先让截取的子串字符数等于参数中的字节数
String subStr = str.substring(0, charsNumber); //截取角标从0到charsNumber的子串
int bytesNumber = subStr.getBytes("GBK").length; //以GBK表编码子串,获取字节数
while(!(len >= bytesNumber)){ //按题中要求,子串必须符合: "所要截取的字节数" >= "最终截取子串所具有的字节数"
charsNumber=charsNumber-1;//子串字符数减一,重新从头往后截取
subStr = str.substring(0, charsNumber);
bytesNumber = subStr.getBytes("GBK").length;
}
System.out.println("截取"+len+"个字节:"+subStr); //打印结果
}
}
复制代码
作者:
songwei
时间:
2015-8-31 14:10
自己给自己顶一个,PS:技术分如何获取啊??
作者:
vipsong
时间:
2015-8-31 15:12
package com.itheima.test;
import java.io.IOException;
public class CutStringDemo {
public static void main(String[] args) throws IOException {
String string = "ab你cd好";
int length1 = string.getBytes("UTF-8").length;
for (int x = 0; x < length1; x++) {
System.out.println("UTF-8截取到第" + (x + 1) + "个字节的内容是:" + CutStringByBytesUTF8(string, x + 1));
}
int length2 = string.getBytes("GBK").length;
for (int x = 0; x < length2; x++) {
System.out.println("GBK截取到第" + (x + 1) + "个字节的内容是:" + CutStringByBytes(string, x + 1));
}
}
public static String CutStringByBytesUTF8(String string, int len) throws IOException {
// 将字符串转换成字节数组
byte[] buf = string.getBytes("UTF-8");
int count = 0;
for (int i = len - 1; i >= 0; i--) {//从最后的角标开始取值
if (buf[i] < 0)
count++;
else // 判断,如果截取到的字节不小于零,就不用判断了。
break;
}
if (count % 3 == 0) {
return new String(buf, 0, len, "UTF-8");
} else if(count % 3 == 1 ){
return new String(buf, 0, len - 1, "UTF-8");
}else {
return new String(buf, 0, len - 2, "UTF-8");
}
}
public static String CutStringByBytes(String string, int len) throws IOException {
// 将字符串转换成字节数组
byte[] buf = string.getBytes("GBK");
int count = 0;
for (int i = len - 1; i >= 0; i--) {//从最后的角标开始取值
if (buf[i] < 0)
count++;
else // 判断,如果截取到的字节不小于零,就不用判断了。
break;
}
if (count % 2 == 0) {
return new String(buf, 0, len, "GBK");
} else {
return new String(buf, 0, len - 1, "GBK");
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2