小女急求各位前辈帮忙:字符串截取问题!!! 一串字符串(有中文、数字、标点符号等)不知道总长度,要以每63个字节为单位截取并组成数组,且中文不被截成两半",谢谢各位前辈了~~!!!急~~~!!! 天高云淡 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 mission impossible!每63个字节为单位,且中文不被截成两半。如果全是中文,那岂不是必然切出半个汉字了! 那就在第63个字节处判断好了先读0到63个字节放到 字节数组中byte b[]=null;s.getBytes(0, 63, b, 0);中国汉字的编码 16位的高8位肯定是大于 127的,用以区别英文标准的ASCII 所以你只需判断当前字符是否>127,如果大于127,那么就再读一个字节凑成汉字就可以了 //判断字符是否为中文String str = "sdfh断sdfg该字符是hjt否为中文hjr";int count = 0; // 计数for(int i=0;i<str.length();i++){ if(str.substring(i, i+1).matches("[\u4e00-\u9fa5]")){ // 当前是汉字 count += 2; System.out.println(str.subSequence(i, i+1)+"为汉字。"); }else{ // 不是汉字 count += 1; System.out.println(str.substring(i, i+1)+"不为汉字"); } // 判断计数值决定何时截断和具体截断位置 ... ... } 答:急~~~!!! [/color你急。我们大家也急。你说清楚些:62个字节(少一些行不行?)若:必须保证就是63字节且汉字不许分一半,则:我认为:无法解决(急了没用)。若:[color=#FF0000]允许少一个(或多一个),则问题十分容易解决。,就是这么个事。 美女发照片看看。截中文很简单,根据unicode判断,如果是ascii,index++,其他字符index+2好了。 给你点思路:(个人意见仅供参考)一个截取方法a一个计数方法b一个判断方法c一个特殊处理方法d//方法用途:循环截取字符并赋值给新数组 a { // 方法用途:判断某一字符是否汉字 c { //方法用途:根据判断结果计数byte..(实现你的63byte一截) b{} //方法用途:根据c的判断处理 汉字问题.. d{} }} 答:没有生气啊。问题描述得越清楚,大家少走弯路啊。代码供你参考吧。import java.util.*;public class SplitString { //将字符串s按63字节分割。若正好是汉字的一半,则是62字节。 //返回:所有这些byte[]所组成的一个ArrayList。// 用法:al.get(0)是第一个byte[] //al.get(1)是第二个byte[] //最后一个是:al.get(al.size()-1);是最后一个byte[] public static ArrayList<byte[]> toBytes(String s) { ArrayList<byte[]> al=new ArrayList<byte[]>(); byte[] b=s.getBytes();//将串转成字节数组。按GBK编码。 int start=0,end=start+63-1;//从start到end共63个字节 while( end < b.length )//还有数据时 { if( (char)(b[end]) >= (char)160 )//正好是半个汉字 { end--;//将这半个汉字留到下一次。向前移一个字节,即:62个字节 } byte[] data=new byte[end-start+1];//形成本次的字节数组(63或62) System.arraycopy(b, start, data, 0, data.length);//将字节复制过来 al.add(data);//放入ArrayList中 start=end+1;//下一个63字节块的起点 end=start+63-1;//下一个63字节块的终点。共63字节。 }//while if( start<b.length)//处理最后剩余的不足63字节的数据 { end=b.length-1;//最后一个字节位置 byte[] data=new byte[end-start+1];//形成本次的字节数组(63或62) System.arraycopy(b, start, data, 0, data.length);//将字节复制过来 al.add(data);//放入ArrayList中 } return al; } //测试 public static void main(String[] args) { String s="aa啊阿"; ArrayList<byte[]> al=null; al=toBytes(s); for(byte[] b:al) { for(byte b1:b) { System.out.print((b1&0x000000ff)+" "); } System.out.println(""); } }} 如果是短信息,sp业务中一般为70个字符,msg.length()<= 70,干嘛一定要63个字符 输入为一个字符串和字节数,输出为按字节截取的字符串http://blog.csdn.net/yuzhu2008/archive/2008/05/14/2446860.aspx A fatal error has been detected by the Java Runtime Environment java线程问题 什么是soa 怎么把JSpinner的返回值转换为int类型????? sun java 上doc文档下载在哪 内存问题 新手请求高手推荐servlet书 请教 请问mysql的jdbc驱动放在什麽包里 java 解压gz文件 第一次来,希望大家多多指教! Swing 使用LookAndFeel 后中文乱码。请哪个大哥帮帮忙
每63个字节为单位,且中文不被截成两半。如果全是中文,那岂不是必然切出半个汉字了!
s.getBytes(0, 63, b, 0);
中国汉字的编码 16位的高8位肯定是大于 127的,用以区别英文标准的ASCII
所以你只需判断当前字符是否>127,如果大于127,那么就再读一个字节凑成汉字就可以了
String str = "sdfh断sdfg该字符是hjt否为中文hjr";
int count = 0; // 计数
for(int i=0;i<str.length();i++){
if(str.substring(i, i+1).matches("[\u4e00-\u9fa5]")){ // 当前是汉字
count += 2;
System.out.println(str.subSequence(i, i+1)+"为汉字。");
}else{ // 不是汉字
count += 1;
System.out.println(str.substring(i, i+1)+"不为汉字");
}
// 判断计数值决定何时截断和具体截断位置
... ...
}
截中文很简单,根据unicode判断,如果是ascii,index++,其他字符index+2好了。
(个人意见仅供参考)
一个截取方法a
一个计数方法b
一个判断方法c
一个特殊处理方法d//方法用途:循环截取字符并赋值给新数组
a {
// 方法用途:判断某一字符是否汉字
c {
//方法用途:根据判断结果计数byte..(实现你的63byte一截)
b{}
//方法用途:根据c的判断处理 汉字问题..
d{}
}
}
public class SplitString { //将字符串s按63字节分割。若正好是汉字的一半,则是62字节。
//返回:所有这些byte[]所组成的一个ArrayList。
// 用法:al.get(0)是第一个byte[]
//al.get(1)是第二个byte[]
//最后一个是:al.get(al.size()-1);是最后一个byte[]
public static ArrayList<byte[]> toBytes(String s)
{
ArrayList<byte[]> al=new ArrayList<byte[]>();
byte[] b=s.getBytes();//将串转成字节数组。按GBK编码。
int start=0,end=start+63-1;//从start到end共63个字节
while( end < b.length )//还有数据时
{
if( (char)(b[end]) >= (char)160 )//正好是半个汉字
{
end--;//将这半个汉字留到下一次。向前移一个字节,即:62个字节
}
byte[] data=new byte[end-start+1];//形成本次的字节数组(63或62)
System.arraycopy(b, start, data, 0, data.length);//将字节复制过来
al.add(data);//放入ArrayList中
start=end+1;//下一个63字节块的起点
end=start+63-1;//下一个63字节块的终点。共63字节。
}//while
if( start<b.length)//处理最后剩余的不足63字节的数据
{
end=b.length-1;//最后一个字节位置
byte[] data=new byte[end-start+1];//形成本次的字节数组(63或62)
System.arraycopy(b, start, data, 0, data.length);//将字节复制过来
al.add(data);//放入ArrayList中
}
return al;
}
//测试
public static void main(String[] args) {
String s="aa啊阿";
ArrayList<byte[]> al=null;
al=toBytes(s);
for(byte[] b:al)
{
for(byte b1:b)
{
System.out.print((b1&0x000000ff)+" ");
}
System.out.println("");
} }}