黑马程序员技术交流社区
标题:
大神帮忙解答一下小程序问题!
[打印本页]
作者:
郭帅帅
时间:
2014-5-20 19:49
标题:
大神帮忙解答一下小程序问题!
本帖最后由 郭帅帅 于 2014-5-21 15:20 编辑
package com.itheima;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class Test10 {
/**
* 这个是从网上借鉴来的,不是太懂
* 编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),例如:
* 从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
String s = "HM程序员";
System.out.println(subStrByByte(s, 3));
}
//将截取字符串的方法封装成单独的函数;
public static String subStrByByte(String str, int bLen) throws Exception {
//定义两个变量记录长度值;
int preLen = 0;
int len = 0;
str = str.substring(0, bLen);
//用GBK的码表将字符串添加到字节数组当中;
byte[] b = str.getBytes("GBK");
if(b.length == bLen) {
return str;
}
//这个for循环里面的判断没搞懂!!!
for(int i=0; i<str.length(); i++) {
if(str.charAt(i) < 0 || str.charAt(i) > 127) {
len += 2;
}
else {
len += 1;
}
if(len > bLen) {
byte[] newB = new byte[preLen];
System.arraycopy(b, 0, newB, 0, preLen);
return new String(newB);
}
preLen = len;
}
return str;
}
}
复制代码
作者:
郭帅帅
时间:
2014-5-20 19:51
for循环里面的判断没搞懂,求解答
作者:
Lin0411
时间:
2014-5-20 20:02
for(int i=0; i<str.length(); i++)
{
if(str[i] < 0 || str[i] > 127) //如果它是一个中文对应的字节
len += 2; //一个中文对应两个字节
else
len += 1; //一个键盘字符对应一个字节
if(len > bLen ) //如果已经达到要取得字节数
{
byte[] newB = new byte[preLen]; //创建一个存放指定字节数的字节数组
System.arraycopy(b, 0, newB, 0, preLen); //将指定长度为preLen的b数组中的字节拷贝到newB字节数组中
return new String(newB); //返回newB字节数组对应的字符串
}
else
prelen = len; //否则记录现在已经取到的字节数
}
作者:
郭帅帅
时间:
2014-5-21 15:10
Lin0411 发表于 2014-5-20 20:02
for(int i=0; i 127) //如果它是一个中文对应的字节
len += 2; //一个中文对应两个字节
...
if(str
< 0 || str
> 127) //如果它是一个中文对应的字节,,这句不够准确。不过还是谢谢你的解答!
老实说你是不是按照字面意思理解啊?呵呵,不过,我刚上网查到了,这样的判断不是说字节,而是字符。
0-127对应的是ASCII码表中的占一个字节的字符,除此之外就不是占一个字节的字符了
str
<0||str
>127的意思是判断汉字用的,因为汉字这种字符不在0-127之间。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2