首页 > java按字节拆分字符串 后在拼成字符串

java按字节拆分字符串 后在拼成字符串

是这样的一个方法

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;

}

上面是新代码,但是还有有乱码


解决办法:如果是要跨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, 所以就给了一个�.

总结一下, 一定按编码格式去 正确 编解码. 否则信息会丢失!


楼上正解

【热门文章】
【热门文章】