是这样的一个方法
public static String[] splitByByteSize(String content, int size){
byte[] bytes = content.getBytes();
int totalSize = bytes.length;
int partNum = 0;
if(totalSize == 0){
return new String[0];
}
if(totalSize % size == 0){
partNum = totalSize / size;
}else{
partNum = totalSize / size + 1;
}
String[] arr = new String[partNum];
int arrIndex = -1;
for(int i=0;i<totalSize;i++){
if(i%size == 0){
arrIndex++;
arr[arrIndex] = "";
}
arr[arrIndex]+=((char)bytes[i]);
}
return arr;
}
String s[] = splitByByteSize("水",15);
int byteLen = 0;
for(int i=0;i<s.length;i++){
byteLen+=s[i].getBytes().length;
}
byte[] bytes = new byte[byteLen];
int offset = 0;
for(int i=0;i<s.length;i++){
System.arraycopy(s[i].getBytes(), 0, bytes, offset, s[i].getBytes().length);
offset += s[i].getBytes().length;
}
System.out.println("--"+new String(bytes));
按字节拆分后等字节的放到String数组中。另外有个方法接收String数组后在拼成content原来的值。现在是如果有中文,按字节拆分会有乱码。但是感觉后面按照String数组拼成字符串应该不会乱码。但是还是乱码。请问怎么做才能在用返回的String数组拼成字符串不乱码。
public static void main(String[] args) throws UnsupportedEncodingException {
String arr[] = splitByByteSize("abc刘defghijklmnopqrstuvwxyz",4);
int byteLen = 0;
for(int i=0;i<arr.length;i++){
byteLen+=arr[i].getBytes().length;
}
byte[] bytes = new byte[byteLen];
int offset = 0;
for(int i=0;i<arr.length;i++){
System.arraycopy(arr[i].getBytes("utf-8"), 0, bytes, offset, arr[i].getBytes("utf-8").length);
offset += arr[i].getBytes("utf-8").length;
}
System.out.println(">>"+new String(bytes));
}
public static String[] splitByByteSize(String content, int size) throws UnsupportedEncodingException{
byte[] bytes = content.getBytes("utf-8");
int totalSize = bytes.length;
int partNum = 0;
if(totalSize == 0){
return new String[0];
}
if(totalSize % size == 0){
partNum = totalSize / size;
}else{
partNum = totalSize / size + 1;
}
String[] arr = new String[partNum];
int offset = 0;
byte newBytes[] = new byte[size];
for(int i=0;i<partNum-1;i++){
System.arraycopy(bytes, offset, newBytes, 0, size);
arr[i] = new String(newBytes,"utf-8");
offset += size;
}
System.arraycopy(bytes, offset, newBytes, 0, totalSize-offset);
arr[partNum-1] = new String(newBytes,"utf-8");
return arr;
}
上面是新代码,但是还有有乱码
- 首先,将string转换成byte流的时候,一定要指定编码(
content.getBytes(utf-8)
),否则在传输的时候,很有可能就是个杯具; - 其次,
arr[arrIndex]+=((char)bytes[i])
这个代码,在Java里面可以通过+=运算符将string和char相加? - 同上代码,对于双字节编码(例如中文),bytes[i]可能会是一个负数,强制转型成char,由于char的取值范围是0〜(2^16)-1,故此时会转换成一个正值,这样拆分后必然出现乱码,而且这个转换不一定是可逆的,此时再也无法由char恢复byte了,所以拆分后自然无法恢复。
解决办法:如果是要跨JVM传输,建议直接传输byte数组,然后重组;如果不跨JVM传输,可先重组成string,然后传输,不过不是特殊需要,还是建议传输byte数组,最终在接收端重组。在这个过程中,有一点切记:转换过程中务必指定编码。这是我们项目组血的教训,后来重申的重要原则之一。
byte[] array = content.getBytes("utf-8"); // 发送端
String content = new String(array, "utf-8"); // 接收端
楼主, java里字符串不能这么乱搞的啊.
比方说, 一个汉字, 内码unicode转utf8, 三个字节a,b,c, 那么你去按两个字节(ab), 一个字节(c)这样来解码utf8到unicode, 得到的是两个 "replacement character �", 信息在这里丢失了
写个test给你吧.
@Test
public void fdfa() throws Exception{
byte[] bytes="中".getBytes("utf8");
System.out.println(bytes.length); //3
byte[] b=new byte[2];
System.arraycopy(bytes, 0, b, 0, 2);
String s=new String(b,"utf8"); // s为�
System.out.println(s); //打印?
}
具体原因呢, 得看一下utf8的编码: http://en.wikipedia.org/wiki/UTF-8
对于三字节的编码来说, 是这个样子的: 1110xxxx 10xxxxxx 10xxxxxx 你只给了1110xxxx 10xxxxxx, java表示很无力, 没办法解码utf8, 所以就给了一个�.
总结一下, 一定按编码格式去 正确 编解码. 否则信息会丢失!
楼上正解