【发布时间】:2018-02-19 14:55:06
【问题描述】:
我想将String 拆分为String[] 数组,其元素满足以下条件。
s.getBytes(encoding).length不应超过maxsize(int)。如果我用
StringBuilder或+运算符加入拆分后的字符串,结果应该是原始字符串。输入字符串可能有 unicode 字符,在编码时可以有多个字节,例如UTF-8。
所需的原型如下所示。
public static String[] SplitStringByByteLength(String src,String encoding, int maxsize)
以及测试代码:
public boolean isNice(String str, String encoding, int max)
{
//boolean success=true;
StringBuilder b=new StringBuilder();
String[] splitted= SplitStringByByteLength(str,encoding,max);
for(String s: splitted)
{
if(s.getBytes(encoding).length>max)
return false;
b.append(s);
}
if(str.compareTo(b.toString()!=0)
return false;
return true;
}
虽然输入字符串只有 ASCII 字符时看起来很容易,但它可以包含多字节字符的事实让我感到困惑。
提前谢谢你。
编辑:我添加了我的代码实现。 (低效)
public static String[] SplitStringByByteLength(String src,String encoding, int maxsize) throws UnsupportedEncodingException
{
ArrayList<String> splitted=new ArrayList<String>();
StringBuilder builder=new StringBuilder();
//int l=0;
int i=0;
while(true)
{
String tmp=builder.toString();
char c=src.charAt(i);
if(c=='\0')
break;
builder.append(c);
if(builder.toString().getBytes(encoding).length>maxsize)
{
splitted.add(new String(tmp));
builder=new StringBuilder();
}
++i;
}
return splitted.toArray(new String[splitted.size()]);
}
这是解决这个问题的唯一方法吗?
【问题讨论】:
-
为什么你甚至转换为字节而不是在字符基础上工作?
-
您应该能够只计算字符数,然后在该索引处拆分。
-
因为我必须将字符串发送到另一个接受 UTF-8 VNOTE 文件的设备,并且它无法处理超过 400 字节的字符串。所以我必须将我的字符串拆分成不超过 400 字节的字符串。
-
我很困惑,你想在空终止符上拆分还是在空格上拆分?
-
由于当前的代码并不能真正满足完整的要求,我不确定它是否真的离题了。
标签: java string character-encoding