求助]一个包含中英文的字符串转换成字节数组后,怎样保证拆分的时候不出现把汉字从中间分开而出现乱码?

时间:2023-01-09 23:05:48
[求助]一个包含中英文的字符串转换成字节数组后,怎样保证拆分的时候不出现把汉字从中间分开而出现乱码?
而且,我想从这个字节数组里,截取任意的一段。
比如说:
String s = new String("我想从sdf这个字sdfsaf节数sdafasd组里,截取sdf任意的段");
byte [] sbyt = s.getByte();
我想取得,字符串的前20个字节!如何取得啊?
有没有好的方法呢!!!!??
急急急急!!!!!!!!!!!!

11 个解决方案

#1


判断第20个字节的码值是否大于08xb,如果是说明汉字被切分了。

#2


我想问一下,”08xb“,为什么,大于它就说明汉字被拆分了!!??

#3


在Java中永远不会出现这种情况!
Java用的是Uncode码!你用Byte[]初始化一个gb2312的字符串。

#4


而且,我不知道“20个字节的码值”如何取得啊?

#5


你看看汉字编码吧,一般来说汉字编码是由两个字节组成的,第一个字节是从128-155的,也就是说十六进制的08;而ascII 码则为0-127;

#6


用循环去取不就ok了吗?
for (int i=0,i<sbyt.length;i++) 
if (i==19) return sbyt[i];

#7


能不能,举一个简单的例子呢!

#8


准确地说,大于08xb不能保证是汉字,大可以保证一定是亚洲字符,如,日文,韩文。
String str = "woshi中国人wozihao!"
至于取得方法,pnileotgx(tianlai) 的方法就可以阿

#9


我发现,用pnileotgx(tianlai) 的方法:
——————————————————————————————
public class bytetest 
{
public static void main(String[] args) 
{
String s = "离开abc";
byte [] b = s.getBytes();
for (int i=0;i<b.length;i++) 
{
//if (i==2)
System.out.println("b["+i+"]="+b[i]);

}

}
结果显示:
b[0]=-64
b[1]=-21
b[2]=-65
b[3]=-86
b[4]=97
b[5]=98
b[6]=99
——————————————————————————————————
}

#10


为什么,汉字都为负数,英文都是正数?我还是不明白啊!到底怎么判断啊?可以根据我上面的例子写一个程序吗!?拜托了!

#11


我自己解决了!!通过汉字都为负数,英文都是正数!!
这个方法如下:
import java.io.*;
import java.util.*;

public class Test
{
String getExtension(String s){
String str = "";
for(int i = 0; i < s.length(); i++){
if(s.charAt(i)=='.'){
str=new String(s.substring(i));
}
}
return str;
}


public static void main(String[] args)
{

int m = 0;
int j = 0;
int k = 0;
String str1 = 
"斯多dfgd丁gdfghssfaafdfhh法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法";
String str2 = "";
byte [] x = str1.getBytes();
for(int i = 0; i < 140; i++){
if(x[i] < 0){
m++;
}
if(x[i] > 0){
j++;
}
}
if(m % 2 == 0){
str2 = new String(x,0,140);
}
if(m % 2 != 0){
str2 = new String(x,0,139);
}

System.out.println(x.length+"   "+str2);

}
}

#1


判断第20个字节的码值是否大于08xb,如果是说明汉字被切分了。

#2


我想问一下,”08xb“,为什么,大于它就说明汉字被拆分了!!??

#3


在Java中永远不会出现这种情况!
Java用的是Uncode码!你用Byte[]初始化一个gb2312的字符串。

#4


而且,我不知道“20个字节的码值”如何取得啊?

#5


你看看汉字编码吧,一般来说汉字编码是由两个字节组成的,第一个字节是从128-155的,也就是说十六进制的08;而ascII 码则为0-127;

#6


用循环去取不就ok了吗?
for (int i=0,i<sbyt.length;i++) 
if (i==19) return sbyt[i];

#7


能不能,举一个简单的例子呢!

#8


准确地说,大于08xb不能保证是汉字,大可以保证一定是亚洲字符,如,日文,韩文。
String str = "woshi中国人wozihao!"
至于取得方法,pnileotgx(tianlai) 的方法就可以阿

#9


我发现,用pnileotgx(tianlai) 的方法:
——————————————————————————————
public class bytetest 
{
public static void main(String[] args) 
{
String s = "离开abc";
byte [] b = s.getBytes();
for (int i=0;i<b.length;i++) 
{
//if (i==2)
System.out.println("b["+i+"]="+b[i]);

}

}
结果显示:
b[0]=-64
b[1]=-21
b[2]=-65
b[3]=-86
b[4]=97
b[5]=98
b[6]=99
——————————————————————————————————
}

#10


为什么,汉字都为负数,英文都是正数?我还是不明白啊!到底怎么判断啊?可以根据我上面的例子写一个程序吗!?拜托了!

#11


我自己解决了!!通过汉字都为负数,英文都是正数!!
这个方法如下:
import java.io.*;
import java.util.*;

public class Test
{
String getExtension(String s){
String str = "";
for(int i = 0; i < s.length(); i++){
if(s.charAt(i)=='.'){
str=new String(s.substring(i));
}
}
return str;
}


public static void main(String[] args)
{

int m = 0;
int j = 0;
int k = 0;
String str1 = 
"斯多dfgd丁gdfghssfaafdfhh法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法斯多夫缩j的发撒非都撒d度发大幅度泗sfaafdf司法";
String str2 = "";
byte [] x = str1.getBytes();
for(int i = 0; i < 140; i++){
if(x[i] < 0){
m++;
}
if(x[i] > 0){
j++;
}
}
if(m % 2 == 0){
str2 = new String(x,0,140);
}
if(m % 2 != 0){
str2 = new String(x,0,139);
}

System.out.println(x.length+"   "+str2);

}
}