Topic: 字节数组转化为String字符串随机截取的方法?

  Print this page

1.字节数组转化为String字符串随机截取的方法? Copy to clipboard
Posted by: GlennLi
Posted on: 2005-09-07 14:58

比如我有一个字符串 str="123abc中文显示",我现在获取str的字节数组
byte[] b=str.getBytes(),然后我要实现一个方法:
String Convert(byte[] b,int offset,int length ) {
//实现将byte[]类型转换为String类型
}

三个参数中,第一个是要转化的字节数组,第二个是开始的位移量,第三个是要转化的字节数。这个方法的功能就是要把字节数组b还原为str,如果offset=0,length=b.length,返回值会正常显示。但是,如果我随机设置offset和length的长度,问题就出现了:
比如 System.out.println(Convert(b,0,7)); 结果是 123abc?
出现问号的原因是"中"字占了两个字节,而length=7刚好读到"中"的第一个字节,因此无法正常显示。
如果使用substring方法,那么所有的字符都是按双字节输出,那么
System.out.println(Convert(b,0,8)); 结果是123abc中文
读取字节的长度length=8还没有度到"文"的字节的时候,"文"就已经读出来了,这样不是想要的结果,因为参数length是字节的长度。
请教怎么样才能在我随机设置offset和length的情况下,单字节和双字节混合都能正常显示,如果恰好读到一个双字节的第一个字节的时候,那么就不要显示这个双字节了,也就是不要出现问号,请问该怎么实现?

2.Re:字节数组转化为String字符串随机截取的方法? [Re: GlennLi] Copy to clipboard
Posted by: GlennLi
Posted on: 2005-09-08 09:38

怎么没有人回复啊??
这个问题很棘手啊!!!!

3.Re:字节数组转化为String字符串随机截取的方法? [Re: GlennLi] Copy to clipboard
Posted by: why
Posted on: 2005-09-08 10:04

> 怎么没有人回复
It's less than a day... and as you said : 这个问题很棘手 Smile

I don't have experience with double-byte characters, but I guess the first (hi) byte of a double-byte character would be certain range of values other than those of regular alpha-numeric characters (and punctuation marks as well).

(Frankly I won't reply if you haven't sent me a PM.)

4.Re:字节数组转化为String字符串随机截取的方法? [Re: GlennLi] Copy to clipboard
Posted by: GlennLi
Posted on: 2005-09-08 11:10

谢谢你的回复,目前我解决了一部分,基本上可以实现了
主要就是添加一个对双字节和单字节的判断,然后就可以对length变量进行设定了

5.Re:字节数组转化为String字符串随机截取的方法? [Re: GlennLi] Copy to clipboard
Posted by: zcjl
Posted on: 2005-09-08 11:41

曾经写过类似的程序,不过不在公司的开发机上
等我回家看看能否找到

6.Re:字节数组转化为String字符串随机截取的方法? [Re: GlennLi] Copy to clipboard
Posted by: GlennLi
Posted on: 2005-09-08 18:29

唉,还是有问题,无法读取传入位移和长度的字节,虽然已经没有乱码了!
谁来救救我!

7.Re:字节数组转化为String字符串随机截取的方法? [Re: GlennLi] Copy to clipboard
Posted by: zcjl
Posted on: 2005-09-08 22:11



/**
* 以byte为单位截取定长的String,用于显示的美观,超过定长部分用..代替
* @param String str 将被截取的源字符串
* @param int byteLength 以byte为单位的字符串长度
* @param boolean isFillNeeded 源字符串长度不够时,是否需要填充空格
*/
public static String truncateString(String str, int byteLength, boolean isFillNeeded) {
try {
if (str.getBytes().length < byteLength) {
if (isFillNeeded) {
int spaceNeeded = byteLength - str.getBytes().length;
StringBuffer sb = new StringBuffer(byteLength);
sb.append(str);
for (int i = 0; i < spaceNeeded; i++) {
sb.append(" ");
}
return sb.toString();
} else {
return str;
}
} else {
while (str.getBytes().length > (byteLength - 2)) {
str = str.substring(0, str.length() - 1);
}

int spaceNeeded = byteLength - 2 - str.getBytes().length;
StringBuffer sb = new StringBuffer(byteLength);
sb.append(str).append("..");
for (int i = 0; i < spaceNeeded; i++) {
sb.append(" ");
}
return sb.toString();
}
} catch (Exception e) {
e.printStackTrace();
return "";
}
}

这是我以前写的一个关于截断字符串的方法,不知道对你是否有用?

8.Re:字节数组转化为String字符串随机截取的方法? [Re: GlennLi] Copy to clipboard
Posted by: GlennLi
Posted on: 2005-09-09 09:58

谢谢楼上这么热心,我试了你的方法,是可行的。
但是,那是输出从字符串开头到指定字节长度byteLength的子字符串。
如果我的起始位置不是开头就有问题,因为我要实现的方法里面有一个offset参数就是来告诉从哪个起始位置开始读byteLength长度的子字符串,如果我开始就读的是双字节的一个字节就会出问题。我试着从你的方法中加入offset,但是不行,因为你是根据byteLength和str.length()的比较来判断是否读到双字节的其中一个字节,如果我随机加入一个offset,这个判断就没有意义了,不知道我这样想对不对?再次谢谢楼上这么热心!如果你想出我的问题的解决办法,麻烦你告诉我,我这两天要交任务了,崩溃中...


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923